aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrewRademacher <andrewrademacher@gmail.com>2016-02-28 12:58:56 -0600
committerAndrewRademacher <andrewrademacher@gmail.com>2016-02-28 12:58:56 -0600
commitf82a8dfc7e9b79ca6b88235d7297252adbb6d364 (patch)
tree8eccc25ea8f4ed3e45e1f1a0b0158ccb9324dcb8
parentb23afe7b9089b3177d9aee994464f72e52efbd2a (diff)
downloadhaskell-graylog-f82a8dfc7e9b79ca6b88235d7297252adbb6d364.tar.gz
haskell-graylog-f82a8dfc7e9b79ca6b88235d7297252adbb6d364.tar.zst
haskell-graylog-f82a8dfc7e9b79ca6b88235d7297252adbb6d364.zip
Implemented UDP chunking.
-rw-r--r--graylog.cabal2
-rw-r--r--src/Graylog/Types.hs5
-rw-r--r--src/Graylog/UDP.hs54
-rw-r--r--test/Test/Graylog/UDP.hs22
-rw-r--r--test/Test/Graylog/UDP/large-sample.json677
5 files changed, 734 insertions, 26 deletions
diff --git a/graylog.cabal b/graylog.cabal
index cc6b2d8..47c8b7d 100644
--- a/graylog.cabal
+++ b/graylog.cabal
@@ -51,6 +51,8 @@ test-suite test-state
51 51
52 , aeson 52 , aeson
53 , aeson-casing 53 , aeson-casing
54 , bytestring
55 , file-embed
54 , network 56 , network
55 , scientific 57 , scientific
56 , tasty 58 , tasty
diff --git a/src/Graylog/Types.hs b/src/Graylog/Types.hs
index 8fad8cc..5c32a8b 100644
--- a/src/Graylog/Types.hs
+++ b/src/Graylog/Types.hs
@@ -8,6 +8,7 @@ module Graylog.Types
8 , _graylogAddress 8 , _graylogAddress
9 , _graylogSocket 9 , _graylogSocket
10 , _graylogHostName 10 , _graylogHostName
11 , _graylogChunkSize
11 , ChunkSize 12 , ChunkSize
12 13
13 , defaultChunkSize 14 , defaultChunkSize
@@ -38,7 +39,9 @@ defaultChunkSize = 8192
38 39
39openGraylog 40openGraylog
40 :: HostName -> ServiceName -> ChunkSize -> IO (Either String Graylog) 41 :: HostName -> ServiceName -> ChunkSize -> IO (Either String Graylog)
41openGraylog h p cksize = getAddrInfo Nothing (Just h) (Just p) >>= \case 42openGraylog h p cksize
43 | cksize < 1024 = return $ Left "ChunkSize must be at least 1024."
44 | otherwise = getAddrInfo Nothing (Just h) (Just p) >>= \case
42 [] -> return $ Left "No address info found." 45 [] -> return $ Left "No address info found."
43 infos -> 46 infos ->
44 case find (\i -> addrSocketType i == Datagram) infos of 47 case find (\i -> addrSocketType i == Datagram) infos of
diff --git a/src/Graylog/UDP.hs b/src/Graylog/UDP.hs
index c925d7e..cd7fe5a 100644
--- a/src/Graylog/UDP.hs
+++ b/src/Graylog/UDP.hs
@@ -5,37 +5,45 @@ module Graylog.UDP
5 ) where 5 ) where
6 6
7import Data.Aeson 7import Data.Aeson
8{-import Data.ByteString.Builder-} 8import Data.ByteString.Builder
9{-import qualified Data.ByteString.Lazy as LBS-} 9import qualified Data.ByteString.Lazy as LBS
10{-import Data.Word-} 10import Data.Monoid
11import Data.Word
11import Network.Socket.ByteString.Lazy 12import Network.Socket.ByteString.Lazy
12{-import System.Random-} 13import System.Random
13 14
14import Graylog.Gelf as Export 15import Graylog.Gelf as Export
15import Graylog.Types as Export 16import Graylog.Types as Export
16 17
17sendLog :: Graylog -> GELF -> IO () 18sendLog :: Graylog -> GELF -> IO ()
18sendLog glog msg = do 19sendLog glog msg = do
19 _ <- send (_graylogSocket glog) raw 20 cks <- chunky glog raw
20 print raw 21 mapM_ (send $ _graylogSocket glog) cks
21 return ()
22 where 22 where
23 raw = encode msg 23 raw = encode msg
24 24
25{-sendLog :: Graylog -> GELF -> IO ()-} 25chunky :: Graylog -> LBS.ByteString -> IO [LBS.ByteString]
26{-sendLog glog msg = do-} 26chunky glog raw = do
27 {-cks <- chunky glog raw-} 27 groupId <- randomIO
28 {-mapM_ (send $ _graylogSocket glog) cks-} 28 let groups = divide totalNum raw
29 {-where-} 29 return $ append groupId groups seqNums
30 {-raw = encode msg-} 30 where
31 magic = word8 0x1e <> word8 0x0f
32 seqNums = [0..] :: [Word8]
33 totalNum = if excess > 0 then count + 1 else count
34 (count, excess) = quotRem (LBS.length raw) gsize
35 hlen = 12
36 gsize = (fromIntegral (_graylogChunkSize glog)) - hlen
37
38 divide 0 dat = [dat]
39 divide num dat = let (pre, post) = LBS.splitAt gsize dat
40 in pre : divide (num - 1) post
31 41
32{-chunky :: Graylog -> LBS.ByteString -> IO [LBS.ByteString]-} 42 append _ [] _ = []
33{-chunky glog raw = do-} 43 append _ _ [] = error "the impossible has happened."
34 {-groupId <- randomIO-} 44 append gid (g:gs) (s:ss) = (toLazyByteString
35 {-splitAt gsize-} 45 $ magic
36 {-where-} 46 <> word64BE gid
37 {-magic = word8 0x1e <> word8 0x0f-} 47 <> word8 s
38 {-seqNum = undefined-} 48 <> word8 (fromIntegral totalNum)
39 {-(count, excess) = quotRem (LBS.length raw) gzie-} 49 <> lazyByteString g) : append gid gs ss
40 {-hlen = 12-}
41 {-gsize = (fromIntegral (_graylogChunkSize glog)) - hlen-}
diff --git a/test/Test/Graylog/UDP.hs b/test/Test/Graylog/UDP.hs
index d62f11a..6534c69 100644
--- a/test/Test/Graylog/UDP.hs
+++ b/test/Test/Graylog/UDP.hs
@@ -1,16 +1,23 @@
1{-# LANGUAGE OverloadedStrings #-} 1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE TemplateHaskell #-}
2 3
3module Test.Graylog.UDP where 4module Test.Graylog.UDP where
4 5
6import qualified Data.ByteString as BS
7import Data.FileEmbed
8import qualified Data.Text.Encoding as T
5import Test.Tasty 9import Test.Tasty
6import Test.Tasty.HUnit 10import Test.Tasty.HUnit
7 11
8import Graylog.UDP 12import Graylog.UDP
9 13
14largeSample :: BS.ByteString
15largeSample = $(embedFile "./test/Test/Graylog/UDP/large-sample.json")
16
10tests :: TestTree 17tests :: TestTree
11tests = testGroup "Test.Graylog.UDP" 18tests = testGroup "Test.Graylog.UDP"
12 {-[ testCase "Send: Sample" case_validateSomething-}
13 [ testCase "Send sample message." case_sendSample 19 [ testCase "Send sample message." case_sendSample
20 , testCase "Send large sample message." case_sendLargeSample
14 ] 21 ]
15 22
16case_sendSample :: IO () 23case_sendSample :: IO ()
@@ -18,6 +25,17 @@ case_sendSample = do
18 eglog <- openGraylog "192.168.99.100" "12201" defaultChunkSize 25 eglog <- openGraylog "192.168.99.100" "12201" defaultChunkSize
19 case eglog of 26 case eglog of
20 Left e -> assertFailure e 27 Left e -> assertFailure e
21 Right g -> sendLog g sample 28 Right g -> sendLog g sample >> closeGraylog g
22 where 29 where
23 sample = simpleGelf "localhost" "hello world!" 30 sample = simpleGelf "localhost" "hello world!"
31
32case_sendLargeSample :: IO ()
33case_sendLargeSample = do
34 eglog <- openGraylog "192.168.99.100" "12201" defaultChunkSize
35 case eglog of
36 Left e -> assertFailure e
37 Right g -> sendLog g sample >> closeGraylog g
38 where
39 sample = (simpleGelf "localhost" "hello world!")
40 { _gelfFullMessage = Just $ T.decodeUtf8 largeSample }
41
diff --git a/test/Test/Graylog/UDP/large-sample.json b/test/Test/Graylog/UDP/large-sample.json
new file mode 100644
index 0000000..1a047fb
--- /dev/null
+++ b/test/Test/Graylog/UDP/large-sample.json
@@ -0,0 +1,677 @@
1[
2 {
3 "_id": "56d34108404074efe47fe0ff",
4 "index": 0,
5 "guid": "eb3d3a63-834a-4e59-b6fe-0eb0205c5766",
6 "isActive": true,
7 "balance": "$2,268.29",
8 "picture": "http://placehold.it/32x32",
9 "age": 21,
10 "eyeColor": "green",
11 "name": "Hendricks Duffy",
12 "gender": "male",
13 "company": "VERAQ",
14 "email": "hendricksduffy@veraq.com",
15 "phone": "+1 (904) 512-3102",
16 "address": "134 Varanda Place, Manila, Alaska, 9021",
17 "about": "Lorem reprehenderit elit amet do velit ea sunt voluptate nisi duis. Mollit sint occaecat aute amet esse occaecat sunt minim pariatur consequat sit aute dolor amet. Culpa duis do sunt ipsum dolore tempor. Tempor cillum elit officia pariatur duis irure irure quis quis do elit. Lorem magna enim aliqua id proident voluptate magna ex laborum sit in laboris. Ullamco tempor aliqua duis cillum exercitation velit id dolore consectetur pariatur Lorem. Dolore cupidatat elit duis aliquip sunt.\r\n",
18 "registered": "2014-05-28T05:46:32 +05:00",
19 "latitude": -46.834546,
20 "longitude": 56.003786,
21 "tags": [
22 "ex",
23 "excepteur",
24 "excepteur",
25 "deserunt",
26 "aliquip",
27 "culpa",
28 "laboris"
29 ],
30 "friends": [
31 {
32 "id": 0,
33 "name": "Wolf Noble"
34 },
35 {
36 "id": 1,
37 "name": "Shelby Knapp"
38 },
39 {
40 "id": 2,
41 "name": "Carly Snider"
42 }
43 ],
44 "greeting": "Hello, Hendricks Duffy! You have 9 unread messages.",
45 "favoriteFruit": "apple"
46 },
47 {
48 "_id": "56d3410843a42c9fa5359530",
49 "index": 1,
50 "guid": "3b6f83ae-ac2e-412b-8d03-174b0fb7d609",
51 "isActive": false,
52 "balance": "$1,660.14",
53 "picture": "http://placehold.it/32x32",
54 "age": 28,
55 "eyeColor": "green",
56 "name": "Wilkinson Wade",
57 "gender": "male",
58 "company": "BYTREX",
59 "email": "wilkinsonwade@bytrex.com",
60 "phone": "+1 (826) 446-3590",
61 "address": "955 Jamison Lane, Nord, Texas, 942",
62 "about": "Aliqua in nostrud et excepteur nisi. Nisi tempor mollit sint eiusmod dolore aliquip minim. Ullamco ut dolore labore irure sit.\r\n",
63 "registered": "2016-01-30T11:46:52 +06:00",
64 "latitude": 34.701696,
65 "longitude": 64.598148,
66 "tags": [
67 "laboris",
68 "sunt",
69 "consequat",
70 "fugiat",
71 "consectetur",
72 "proident",
73 "tempor"
74 ],
75 "friends": [
76 {
77 "id": 0,
78 "name": "Opal Juarez"
79 },
80 {
81 "id": 1,
82 "name": "Holland Griffith"
83 },
84 {
85 "id": 2,
86 "name": "Ballard Craft"
87 }
88 ],
89 "greeting": "Hello, Wilkinson Wade! You have 1 unread messages.",
90 "favoriteFruit": "banana"
91 },
92 {
93 "_id": "56d341084128d62763e9caec",
94 "index": 2,
95 "guid": "de74c233-aa79-4682-bc53-5bc8a3a18e59",
96 "isActive": false,
97 "balance": "$2,356.76",
98 "picture": "http://placehold.it/32x32",
99 "age": 23,
100 "eyeColor": "brown",
101 "name": "Elva Greer",
102 "gender": "female",
103 "company": "NIKUDA",
104 "email": "elvagreer@nikuda.com",
105 "phone": "+1 (935) 556-3236",
106 "address": "292 Jerome Avenue, Maybell, Florida, 1253",
107 "about": "Consectetur aliqua ex labore anim quis elit dolor. Aute velit velit consectetur ullamco ea aliquip Lorem magna. Exercitation incididunt labore nostrud ipsum et cillum tempor aliqua laboris in amet minim veniam. Cillum cupidatat qui non aute reprehenderit fugiat sit.\r\n",
108 "registered": "2015-02-19T05:31:22 +06:00",
109 "latitude": -28.943551,
110 "longitude": -5.000076,
111 "tags": [
112 "officia",
113 "ex",
114 "qui",
115 "ullamco",
116 "consequat",
117 "mollit",
118 "consectetur"
119 ],
120 "friends": [
121 {
122 "id": 0,
123 "name": "Louise Oneal"
124 },
125 {
126 "id": 1,
127 "name": "Melba Glass"
128 },
129 {
130 "id": 2,
131 "name": "Jillian Wright"
132 }
133 ],
134 "greeting": "Hello, Elva Greer! You have 6 unread messages.",
135 "favoriteFruit": "apple"
136 },
137 {
138 "_id": "56d34108067fc7188e1205ff",
139 "index": 3,
140 "guid": "37433441-2f81-4d13-a827-2790bf3adb3d",
141 "isActive": false,
142 "balance": "$2,202.96",
143 "picture": "http://placehold.it/32x32",
144 "age": 31,
145 "eyeColor": "brown",
146 "name": "Brewer Gordon",
147 "gender": "male",
148 "company": "HARMONEY",
149 "email": "brewergordon@harmoney.com",
150 "phone": "+1 (884) 479-3048",
151 "address": "731 Grattan Street, Boomer, Massachusetts, 8660",
152 "about": "Cupidatat dolore id aute laborum est aliqua sunt. Proident labore deserunt sit fugiat et magna dolore. Nulla id esse eiusmod ut Lorem esse voluptate Lorem eu aute veniam est pariatur. Eu amet ipsum dolor mollit ullamco. Aute velit velit incididunt eu aute amet nulla sunt enim ea amet minim. Non consequat veniam commodo veniam non.\r\n",
153 "registered": "2015-04-02T06:30:21 +05:00",
154 "latitude": -16.266799,
155 "longitude": -7.521735,
156 "tags": [
157 "do",
158 "do",
159 "nostrud",
160 "consequat",
161 "dolore",
162 "et",
163 "consectetur"
164 ],
165 "friends": [
166 {
167 "id": 0,
168 "name": "Bobbi Guzman"
169 },
170 {
171 "id": 1,
172 "name": "Evangeline Clemons"
173 },
174 {
175 "id": 2,
176 "name": "Alvarez Hinton"
177 }
178 ],
179 "greeting": "Hello, Brewer Gordon! You have 9 unread messages.",
180 "favoriteFruit": "banana"
181 },
182 {
183 "_id": "56d34108ba44995b4d5f9789",
184 "index": 4,
185 "guid": "5ddb0064-f2a6-43ae-ae47-81182f725059",
186 "isActive": true,
187 "balance": "$1,024.75",
188 "picture": "http://placehold.it/32x32",
189 "age": 28,
190 "eyeColor": "blue",
191 "name": "Pamela Sloan",
192 "gender": "female",
193 "company": "ULTRIMAX",
194 "email": "pamelasloan@ultrimax.com",
195 "phone": "+1 (970) 492-2905",
196 "address": "241 Hastings Street, Blodgett, North Carolina, 2051",
197 "about": "Eiusmod labore commodo dolore pariatur. Sint culpa magna ut enim fugiat laboris cupidatat excepteur fugiat nostrud occaecat. Dolor cillum occaecat exercitation minim quis consectetur enim sit. Sunt aute labore culpa occaecat. Eu do nulla pariatur sint sit anim proident aliqua. Commodo ullamco fugiat duis velit ut sint velit ea. Elit ut ut sint aliqua laborum incididunt anim Lorem occaecat in.\r\n",
198 "registered": "2015-06-01T07:14:15 +05:00",
199 "latitude": -57.021481,
200 "longitude": -2.638072,
201 "tags": [
202 "Lorem",
203 "eiusmod",
204 "laboris",
205 "Lorem",
206 "nulla",
207 "deserunt",
208 "aliqua"
209 ],
210 "friends": [
211 {
212 "id": 0,
213 "name": "Vinson Maldonado"
214 },
215 {
216 "id": 1,
217 "name": "Ball Jimenez"
218 },
219 {
220 "id": 2,
221 "name": "Riddle Gallegos"
222 }
223 ],
224 "greeting": "Hello, Pamela Sloan! You have 3 unread messages.",
225 "favoriteFruit": "strawberry"
226 },
227 {
228 "_id": "56d34108e0e975a3a1b5a57f",
229 "index": 5,
230 "guid": "4b8468bd-78b1-4bb1-bdf9-bce85d2fe4b0",
231 "isActive": false,
232 "balance": "$3,046.83",
233 "picture": "http://placehold.it/32x32",
234 "age": 38,
235 "eyeColor": "brown",
236 "name": "Angeline Ford",
237 "gender": "female",
238 "company": "EGYPTO",
239 "email": "angelineford@egypto.com",
240 "phone": "+1 (871) 591-2599",
241 "address": "168 Hoyts Lane, Ilchester, District Of Columbia, 8583",
242 "about": "Sint quis nostrud ex occaecat cillum anim veniam aute ex ipsum minim dolore. Duis reprehenderit sint proident deserunt laboris veniam fugiat aliqua elit. Et cupidatat exercitation non est nisi nisi. Incididunt exercitation nostrud amet nostrud non do excepteur et id consectetur proident. Deserunt commodo fugiat culpa do laboris.\r\n",
243 "registered": "2015-08-23T08:11:58 +05:00",
244 "latitude": 84.55975,
245 "longitude": 56.451822,
246 "tags": [
247 "pariatur",
248 "ad",
249 "eiusmod",
250 "ea",
251 "amet",
252 "occaecat",
253 "exercitation"
254 ],
255 "friends": [
256 {
257 "id": 0,
258 "name": "Houston Hobbs"
259 },
260 {
261 "id": 1,
262 "name": "Audrey Hood"
263 },
264 {
265 "id": 2,
266 "name": "Ila Bowman"
267 }
268 ],
269 "greeting": "Hello, Angeline Ford! You have 7 unread messages.",
270 "favoriteFruit": "strawberry"
271 },
272 {
273 "_id": "56d341081ecd3dc046705a1c",
274 "index": 6,
275 "guid": "ad00d34a-4eb3-412c-b5af-f11358d63761",
276 "isActive": true,
277 "balance": "$3,371.87",
278 "picture": "http://placehold.it/32x32",
279 "age": 29,
280 "eyeColor": "brown",
281 "name": "Kelli Schroeder",
282 "gender": "female",
283 "company": "GAZAK",
284 "email": "kellischroeder@gazak.com",
285 "phone": "+1 (877) 547-3673",
286 "address": "581 College Place, Nescatunga, Rhode Island, 5472",
287 "about": "Culpa amet adipisicing consectetur laboris veniam reprehenderit et mollit quis enim tempor. Amet officia excepteur adipisicing duis velit esse aliqua eu nulla aliqua culpa. Dolor aliquip irure consectetur aliquip nisi sint excepteur reprehenderit voluptate. Ipsum nostrud eiusmod excepteur voluptate nulla esse nisi culpa. Consequat ullamco aliquip pariatur duis labore ullamco do ea cupidatat enim exercitation. Sunt sit ullamco veniam dolore consectetur pariatur commodo consectetur proident do est.\r\n",
288 "registered": "2014-11-03T01:22:40 +06:00",
289 "latitude": 45.221417,
290 "longitude": -66.436558,
291 "tags": [
292 "laborum",
293 "est",
294 "proident",
295 "consequat",
296 "cillum",
297 "nulla",
298 "anim"
299 ],
300 "friends": [
301 {
302 "id": 0,
303 "name": "Rosanne Gregory"
304 },
305 {
306 "id": 1,
307 "name": "Foley Whitney"
308 },
309 {
310 "id": 2,
311 "name": "Deanna Watkins"
312 }
313 ],
314 "greeting": "Hello, Kelli Schroeder! You have 2 unread messages.",
315 "favoriteFruit": "strawberry"
316 },
317 {
318 "_id": "56d341082661728cbb864941",
319 "index": 7,
320 "guid": "ba7bccbc-2911-4d8a-81a6-cca198dc0bf6",
321 "isActive": false,
322 "balance": "$2,329.72",
323 "picture": "http://placehold.it/32x32",
324 "age": 29,
325 "eyeColor": "blue",
326 "name": "Francesca Stanton",
327 "gender": "female",
328 "company": "EMTRAK",
329 "email": "francescastanton@emtrak.com",
330 "phone": "+1 (934) 421-3570",
331 "address": "823 Terrace Place, Alderpoint, Nebraska, 3297",
332 "about": "Eu incididunt id fugiat pariatur cupidatat aliqua id culpa est aliquip cupidatat aliqua qui. Reprehenderit excepteur exercitation labore tempor excepteur elit occaecat aliquip proident proident excepteur sit. Minim duis enim laboris esse ea dolore aliquip. Duis pariatur voluptate deserunt magna non. Laborum elit eiusmod incididunt amet eu non ut ut.\r\n",
333 "registered": "2016-01-31T10:53:50 +06:00",
334 "latitude": 60.764415,
335 "longitude": 3.54402,
336 "tags": [
337 "ipsum",
338 "ullamco",
339 "sit",
340 "cupidatat",
341 "sint",
342 "voluptate",
343 "quis"
344 ],
345 "friends": [
346 {
347 "id": 0,
348 "name": "Daniels Boyd"
349 },
350 {
351 "id": 1,
352 "name": "Freeman Guerrero"
353 },
354 {
355 "id": 2,
356 "name": "Montoya Russell"
357 }
358 ],
359 "greeting": "Hello, Francesca Stanton! You have 10 unread messages.",
360 "favoriteFruit": "strawberry"
361 },
362 {
363 "_id": "56d34108f2dd95917c4c3bed",
364 "index": 8,
365 "guid": "9c5d5f6e-efd8-493b-9439-bf9be2466f4b",
366 "isActive": true,
367 "balance": "$1,829.87",
368 "picture": "http://placehold.it/32x32",
369 "age": 28,
370 "eyeColor": "brown",
371 "name": "Norris Workman",
372 "gender": "male",
373 "company": "APPLIDEC",
374 "email": "norrisworkman@applidec.com",
375 "phone": "+1 (937) 448-2116",
376 "address": "815 Coleridge Street, Torboy, Washington, 2229",
377 "about": "Ex aute duis consequat aliquip dolore qui. Cupidatat reprehenderit incididunt nisi nisi exercitation ut non nostrud eiusmod. Anim esse commodo tempor Lorem sint sint labore irure minim nisi do. Veniam reprehenderit fugiat id quis proident. Ad sint ullamco do exercitation consequat.\r\n",
378 "registered": "2015-07-19T02:35:57 +05:00",
379 "latitude": 34.371249,
380 "longitude": 91.512571,
381 "tags": [
382 "mollit",
383 "officia",
384 "deserunt",
385 "ad",
386 "id",
387 "dolore",
388 "proident"
389 ],
390 "friends": [
391 {
392 "id": 0,
393 "name": "Marilyn Higgins"
394 },
395 {
396 "id": 1,
397 "name": "Elvia Kramer"
398 },
399 {
400 "id": 2,
401 "name": "Sloan Soto"
402 }
403 ],
404 "greeting": "Hello, Norris Workman! You have 5 unread messages.",
405 "favoriteFruit": "strawberry"
406 },
407 {
408 "_id": "56d34108ffc2698a49a1800f",
409 "index": 9,
410 "guid": "445cf14a-a033-4ce0-a9bd-384e1ad04147",
411 "isActive": false,
412 "balance": "$1,794.08",
413 "picture": "http://placehold.it/32x32",
414 "age": 26,
415 "eyeColor": "green",
416 "name": "Gallagher Stout",
417 "gender": "male",
418 "company": "COMBOGENE",
419 "email": "gallagherstout@combogene.com",
420 "phone": "+1 (804) 539-3176",
421 "address": "301 Broadway , Williams, Federated States Of Micronesia, 7658",
422 "about": "Proident proident qui nostrud laborum ex elit id occaecat. Dolor cillum tempor aliquip incididunt deserunt aute pariatur. Enim consectetur incididunt reprehenderit reprehenderit veniam culpa velit culpa exercitation incididunt ea ullamco deserunt veniam. Exercitation ut sunt laboris do eiusmod dolor deserunt nulla aliquip sit anim. Est consequat veniam veniam ad esse eu incididunt. Id veniam nisi ullamco deserunt nulla. Irure officia aliqua quis consequat.\r\n",
423 "registered": "2015-11-30T08:18:33 +06:00",
424 "latitude": -13.868516,
425 "longitude": 6.1512,
426 "tags": [
427 "cupidatat",
428 "duis",
429 "ullamco",
430 "veniam",
431 "occaecat",
432 "id",
433 "nostrud"
434 ],
435 "friends": [
436 {
437 "id": 0,
438 "name": "Flowers Calhoun"
439 },
440 {
441 "id": 1,
442 "name": "Marie Holt"
443 },
444 {
445 "id": 2,
446 "name": "Althea Casey"
447 }
448 ],
449 "greeting": "Hello, Gallagher Stout! You have 7 unread messages.",
450 "favoriteFruit": "strawberry"
451 },
452 {
453 "_id": "56d34108c24e283e1b09fa92",
454 "index": 10,
455 "guid": "684e2aa4-1d23-4d3e-91e1-04ab7956cb00",
456 "isActive": false,
457 "balance": "$3,705.99",
458 "picture": "http://placehold.it/32x32",
459 "age": 31,
460 "eyeColor": "green",
461 "name": "Banks Kaufman",
462 "gender": "male",
463 "company": "XIXAN",
464 "email": "bankskaufman@xixan.com",
465 "phone": "+1 (825) 402-3342",
466 "address": "321 Coyle Street, Elfrida, Puerto Rico, 801",
467 "about": "Qui esse irure elit occaecat dolor mollit nulla cupidatat incididunt non ipsum cupidatat elit. Et culpa dolore adipisicing eiusmod sint nostrud mollit. Adipisicing velit culpa veniam et dolore. Ullamco cillum nulla reprehenderit reprehenderit incididunt.\r\n",
468 "registered": "2015-05-05T05:29:02 +05:00",
469 "latitude": -83.369996,
470 "longitude": -153.192047,
471 "tags": [
472 "fugiat",
473 "do",
474 "est",
475 "ut",
476 "mollit",
477 "duis",
478 "magna"
479 ],
480 "friends": [
481 {
482 "id": 0,
483 "name": "Lidia Coffey"
484 },
485 {
486 "id": 1,
487 "name": "Sheryl Greene"
488 },
489 {
490 "id": 2,
491 "name": "Chang Morris"
492 }
493 ],
494 "greeting": "Hello, Banks Kaufman! You have 2 unread messages.",
495 "favoriteFruit": "banana"
496 },
497 {
498 "_id": "56d3410802c1ad2caf63487c",
499 "index": 11,
500 "guid": "f4fdfb38-0c18-457f-a2b1-2ffd8a52e311",
501 "isActive": false,
502 "balance": "$3,308.76",
503 "picture": "http://placehold.it/32x32",
504 "age": 31,
505 "eyeColor": "green",
506 "name": "Sadie Spencer",
507 "gender": "female",
508 "company": "COGENTRY",
509 "email": "sadiespencer@cogentry.com",
510 "phone": "+1 (829) 416-3379",
511 "address": "356 Milton Street, Siglerville, Montana, 672",
512 "about": "Velit voluptate Lorem sint irure esse nostrud. Officia ex aute consectetur culpa in do culpa dolore in. Laboris dolore laboris id cupidatat exercitation.\r\n",
513 "registered": "2015-11-16T03:18:50 +06:00",
514 "latitude": -65.284906,
515 "longitude": -100.539994,
516 "tags": [
517 "cupidatat",
518 "nulla",
519 "aliquip",
520 "qui",
521 "pariatur",
522 "esse",
523 "in"
524 ],
525 "friends": [
526 {
527 "id": 0,
528 "name": "Rosella Henson"
529 },
530 {
531 "id": 1,
532 "name": "Luella Cervantes"
533 },
534 {
535 "id": 2,
536 "name": "Beatrice Cannon"
537 }
538 ],
539 "greeting": "Hello, Sadie Spencer! You have 7 unread messages.",
540 "favoriteFruit": "strawberry"
541 },
542 {
543 "_id": "56d34108cc0ed7679a460e24",
544 "index": 12,
545 "guid": "d034649e-b506-485f-81de-e6e87f257825",
546 "isActive": false,
547 "balance": "$2,722.49",
548 "picture": "http://placehold.it/32x32",
549 "age": 36,
550 "eyeColor": "blue",
551 "name": "Marguerite Sargent",
552 "gender": "female",
553 "company": "GENMEX",
554 "email": "margueritesargent@genmex.com",
555 "phone": "+1 (972) 407-2114",
556 "address": "730 Richards Street, Malott, West Virginia, 4236",
557 "about": "Sit quis exercitation tempor fugiat anim Lorem consectetur ad. Consequat et cillum exercitation sint culpa et nulla dolor deserunt. Magna esse non excepteur laboris. Ad est amet commodo laboris consectetur mollit consectetur sit sint cupidatat Lorem aliqua officia sint. Pariatur voluptate amet fugiat excepteur cupidatat laborum excepteur velit fugiat proident ea.\r\n",
558 "registered": "2015-08-29T05:49:27 +05:00",
559 "latitude": -80.01189,
560 "longitude": -134.404496,
561 "tags": [
562 "aute",
563 "nisi",
564 "do",
565 "pariatur",
566 "culpa",
567 "minim",
568 "mollit"
569 ],
570 "friends": [
571 {
572 "id": 0,
573 "name": "Betty Gay"
574 },
575 {
576 "id": 1,
577 "name": "Olive West"
578 },
579 {
580 "id": 2,
581 "name": "Wells Morrison"
582 }
583 ],
584 "greeting": "Hello, Marguerite Sargent! You have 1 unread messages.",
585 "favoriteFruit": "strawberry"
586 },
587 {
588 "_id": "56d34108bcdb91f362e8a67d",
589 "index": 13,
590 "guid": "bceb27e9-d344-4ba2-bd63-5d55ee8e05fc",
591 "isActive": false,
592 "balance": "$1,028.16",
593 "picture": "http://placehold.it/32x32",
594 "age": 40,
595 "eyeColor": "green",
596 "name": "Dionne Dickerson",
597 "gender": "female",
598 "company": "LIQUIDOC",
599 "email": "dionnedickerson@liquidoc.com",
600 "phone": "+1 (838) 484-2368",
601 "address": "460 Vandam Street, Fingerville, Colorado, 4022",
602 "about": "Amet veniam do qui non reprehenderit sunt eu voluptate pariatur do ad occaecat duis commodo. Laborum officia velit labore id anim minim. Cillum fugiat duis eu velit in Lorem exercitation sint esse laboris ut culpa amet eu. Sunt pariatur reprehenderit dolor officia. Occaecat eu elit aliqua amet ullamco occaecat aute ex.\r\n",
603 "registered": "2015-09-12T05:36:24 +05:00",
604 "latitude": -17.652115,
605 "longitude": 5.848784,
606 "tags": [
607 "nostrud",
608 "dolore",
609 "elit",
610 "laborum",
611 "labore",
612 "cillum",
613 "sint"
614 ],
615 "friends": [
616 {
617 "id": 0,
618 "name": "Griffith Herman"
619 },
620 {
621 "id": 1,
622 "name": "Bailey Patrick"
623 },
624 {
625 "id": 2,
626 "name": "Webb Patterson"
627 }
628 ],
629 "greeting": "Hello, Dionne Dickerson! You have 1 unread messages.",
630 "favoriteFruit": "apple"
631 },
632 {
633 "_id": "56d3410883dcb3e4b5cd07db",
634 "index": 14,
635 "guid": "631b6afe-bd80-47be-8596-a8f4d147b02b",
636 "isActive": false,
637 "balance": "$3,488.68",
638 "picture": "http://placehold.it/32x32",
639 "age": 36,
640 "eyeColor": "blue",
641 "name": "Compton Solis",
642 "gender": "male",
643 "company": "XEREX",
644 "email": "comptonsolis@xerex.com",
645 "phone": "+1 (806) 407-3164",
646 "address": "985 Radde Place, Hegins, Illinois, 1536",
647 "about": "Ut elit magna sit reprehenderit qui Lorem. Deserunt pariatur mollit anim voluptate culpa dolore. Amet ea cillum ut ullamco tempor cillum quis amet excepteur aliqua. Anim do non eu cillum cillum veniam nulla sunt in. Velit amet aute consectetur consectetur adipisicing eu ex laboris do nostrud ex nisi dolore.\r\n",
648 "registered": "2015-11-25T06:10:23 +06:00",
649 "latitude": 49.258598,
650 "longitude": 38.808716,
651 "tags": [
652 "Lorem",
653 "veniam",
654 "magna",
655 "ut",
656 "irure",
657 "cillum",
658 "in"
659 ],
660 "friends": [
661 {
662 "id": 0,
663 "name": "Cross Dyer"
664 },
665 {
666 "id": 1,
667 "name": "Mathis Ryan"
668 },
669 {
670 "id": 2,
671 "name": "Bernard Weiss"
672 }
673 ],
674 "greeting": "Hello, Compton Solis! You have 8 unread messages.",
675 "favoriteFruit": "strawberry"
676 }
677]