1
1
import uuid
2
2
import json
3
3
import lzma
4
+ import gzip
4
5
import os
5
6
import datetime
6
7
import time
@@ -36,56 +37,73 @@ def do_HEAD(self):
36
37
37
38
def do_POST (self ):
38
39
39
- print ("" )
40
- print ("--------------- <do_POST> ---------------" )
40
+ debuglvl = 5
41
+
42
+ db .debugmsg (debuglvl , "" )
43
+ db .debugmsg (debuglvl , "--------------- <do_POST> ---------------" )
41
44
threadstart = time .time ()
42
45
# default result
43
46
httpcode = 404
44
47
try :
45
48
parsed_path = urllib .parse .urlparse (self .path )
46
- db .debugmsg (5 , "parsed_path:" , parsed_path )
49
+ db .debugmsg (debuglvl , "parsed_path:" , parsed_path )
47
50
patharr = parsed_path .path .split ("/" )
48
- db .debugmsg (5 , "patharr:" , patharr )
51
+ db .debugmsg (debuglvl , "patharr:" , patharr )
49
52
50
53
message = "Unrecognised request: '{}'" .format (parsed_path )
51
54
52
55
if (patharr [1 ].lower () in ["peer" , "doc" ]):
53
56
httpcode = 200
54
57
message = "OK"
55
58
56
- db .debugmsg (5 , "patharr[1].lower():" , patharr [1 ].lower ())
59
+ db .debugmsg (debuglvl , "patharr[1].lower():" , patharr [1 ].lower ())
60
+ db .debugmsg (debuglvl , "self.headers():" , self .headers ())
61
+
62
+ content_len = int (self .headers .get ('Content-Length' ))
63
+ post_body = self .rfile .read (content_len )
64
+ # content-encoding: gzip
65
+ if self .headers .index ("Content-Encoding" )> 0 :
66
+ contentencoding = self .headers .get ("Content-Encoding" )
67
+ db .debugmsg (debuglvl , "contentencoding:" , contentencoding )
68
+ if contentencoding == "lzma" :
69
+ post_body = lzma .decompress (post_body )
70
+ if contentencoding == "gzip" :
71
+ post_body = gzip .decompress (post_body )
57
72
58
73
if patharr [1 ].lower () == "peer" :
59
- content_len = int (self .headers .get ('Content-Length' ))
60
- post_body = self .rfile .read (content_len )
74
+ # content_len = int(self.headers.get('Content-Length'))
75
+ # post_body = self.rfile.read(content_len)
76
+ # lzma.compress(data_in) lzma.decompress(data_in)
77
+ # if contentencoding.lower() == "lzma":
78
+ # message = lzma.compress(message)
61
79
doc = json .loads (post_body )
62
80
63
- db .debugmsg (5 , "doc:" , doc )
81
+ db .debugmsg (debuglvl , "doc:" , doc )
64
82
65
- db .debugmsg (5 , "db:" , db )
66
- db .debugmsg (5 , "db.doc_id:" , db .doc_id )
83
+ db .debugmsg (debuglvl , "db:" , db )
84
+ db .debugmsg (debuglvl , "db.doc_id:" , db .doc_id )
67
85
68
86
if "id" in doc :
69
87
db ._registerpeer (doc ["id" ])
70
88
71
89
saved = db ._saveremotedoc (doc )
72
- db .debugmsg (5 , "saved:" , saved )
90
+ db .debugmsg (debuglvl , "saved:" , saved )
73
91
74
92
if patharr [1 ].lower () == "doc" :
75
93
76
- content_len = int (self .headers .get ('Content-Length' ))
77
- post_body = self .rfile .read (content_len )
94
+ # content_len = int(self.headers.get('Content-Length'))
95
+ # post_body = self.rfile.read(content_len)
78
96
doc = json .loads (post_body )
79
97
80
- db .debugmsg (5 , "doc:" , doc )
98
+ db .debugmsg (debuglvl , "doc:" , doc )
81
99
82
- db .debugmsg (5 , "db:" , db )
83
- db .debugmsg (5 , "db.doc_id:" , db .doc_id )
100
+ db .debugmsg (debuglvl , "db:" , db )
101
+ db .debugmsg (debuglvl , "db.doc_id:" , db .doc_id )
84
102
85
103
if "id" in doc :
86
104
87
105
saved = db ._saveremotedoc (doc )
88
- db .debugmsg (5 , "saved:" , saved )
106
+ db .debugmsg (debuglvl , "saved:" , saved )
89
107
90
108
91
109
@@ -94,36 +112,61 @@ def do_POST(self):
94
112
httpcode = 500
95
113
message = str (e )
96
114
97
- db .debugmsg (5 , "httpcode:" , httpcode , " message:" , message )
115
+ db .debugmsg (debuglvl , "httpcode:" , httpcode , " message:" , message )
116
+
98
117
self .send_response (httpcode )
118
+ # content-encoding: gzip
119
+ if db .contentencoding != None :
120
+ self .send_header ("Content-Encoding" , db .contentencoding )
121
+ # lzma.compress(data_in) lzma.decompress(data_in)
122
+ if db .contentencoding .lower () == "lzma" :
123
+ smessage = bytearray (json .dumps (message ).encode ("utf8" ))
124
+ message = lzma .compress (smessage )
125
+ if db .contentencoding .lower () == "gzip" :
126
+ smessage = bytearray (json .dumps (message ).encode ("utf8" ))
127
+ message = gzip .compress (smessage , compresslevel = 9 )
128
+
129
+ self .send_header ("Content-Length" , len (message ))
130
+
131
+
99
132
self .end_headers ()
100
- self .wfile .write (bytes (message ,"utf-8" ))
133
+ if db .contentencoding != None :
134
+ db .debugmsg (debuglvl , "message:" , message )
135
+ self .wfile .write (message )
136
+ else :
137
+ self .wfile .write (bytes (message ,"utf-8" ))
101
138
threadend = time .time ()
102
139
# base.debugmsg(5, parsed_path.path, " threadstart:", "%.3f" % threadstart, "threadend:", "%.3f" % threadend, "Time Taken:", "%.3f" % (threadend-threadstart))
103
- db .debugmsg (5 , "%.3f" % (threadend - threadstart ), "seconds for " , parsed_path .path )
104
- print ( "--------------- </do_POST> ---------------" )
105
- print ( "" )
140
+ db .debugmsg (debuglvl , "%.3f" % (threadend - threadstart ), "seconds for " , parsed_path .path )
141
+ db . debugmsg ( debuglvl , "--------------- </do_POST> ---------------" )
142
+ db . debugmsg ( debuglvl , "" )
106
143
return
107
144
108
145
def do_GET (self ):
109
146
110
- print ("" )
111
- print ("--------------- <do_GET> ---------------" )
147
+ debuglvl = 5
148
+
149
+
150
+ db .debugmsg (debuglvl , "" )
151
+ db .debugmsg (debuglvl , "--------------- <do_GET> ---------------" )
112
152
threadstart = time .time ()
113
153
httpcode = 404
114
154
message = "Not Found"
115
155
try :
116
156
parsed_path = urllib .parse .urlparse (self .path )
117
- db .debugmsg (5 , "parsed_path:" , parsed_path )
157
+ db .debugmsg (debuglvl , "parsed_path:" , parsed_path )
118
158
patharr = parsed_path .path .split ("/" )
119
- db .debugmsg (5 , "patharr:" , patharr )
159
+ db .debugmsg (debuglvl , "patharr:" , patharr )
120
160
if (patharr [1 ].lower () in ["peer" , "index" , "doc" ]):
161
+
162
+ db .debugmsg (debuglvl , "self.headers():" , self .headers )
163
+
121
164
httpcode = 200
122
165
message = "OK"
123
166
if patharr [1 ].lower () == "peer" :
124
- db .debugmsg (5 , "db:" , db )
167
+ db .debugmsg (debuglvl , "db:" , db )
125
168
doc = db .getselfdoc ()
126
- db .debugmsg (5 , "doc:" , doc )
169
+ db .debugmsg (debuglvl , "doc:" , doc )
127
170
# message = json.dumps(doc).encode("utf8")
128
171
message = json .dumps (doc )
129
172
@@ -157,14 +200,34 @@ def do_GET(self):
157
200
db .debugmsg (5 , "e:" , e )
158
201
httpcode = 500
159
202
message = str (e )
203
+
160
204
self .send_response (httpcode )
205
+ # content-encoding: gzip
206
+ if db .contentencoding != None :
207
+ self .send_header ("Content-Encoding" , db .contentencoding )
208
+ # lzma.compress(data_in) lzma.decompress(data_in)
209
+ if db .contentencoding .lower () == "lzma" :
210
+ smessage = bytearray (json .dumps (message ).encode ("utf8" ))
211
+ message = lzma .compress (smessage )
212
+ if db .contentencoding .lower () == "gzip" :
213
+ smessage = bytearray (json .dumps (message ).encode ("utf8" ))
214
+ message = gzip .compress (smessage , compresslevel = 9 )
215
+
216
+ self .send_header ("Content-Length" , len (message ))
217
+
218
+
219
+
161
220
self .end_headers ()
162
- self .wfile .write (bytes (message ,"utf-8" ))
221
+ if db .contentencoding != None :
222
+ db .debugmsg (debuglvl , "message:" , message )
223
+ self .wfile .write (message )
224
+ else :
225
+ self .wfile .write (bytes (message ,"utf-8" ))
163
226
threadend = time .time ()
164
227
# base.debugmsg(5, parsed_path.path, " threadstart:", "%.3f" % threadstart, "threadend:", "%.3f" % threadend, "Time Taken:", "%.3f" % (threadend-threadstart))
165
- db .debugmsg (5 , "%.3f" % (threadend - threadstart ), "seconds for " , parsed_path .path )
166
- print ( "--------------- </do_GET> ---------------" )
167
- print ( "" )
228
+ db .debugmsg (debuglvl , "%.3f" % (threadend - threadstart ), "seconds for " , parsed_path .path )
229
+ db . debugmsg ( debuglvl , "--------------- </do_GET> ---------------" )
230
+ db . debugmsg ( debuglvl , "" )
168
231
return
169
232
170
233
def handle_http (self ):
@@ -183,10 +246,16 @@ def setdb(self, db):
183
246
184
247
class MyNoSQL :
185
248
version = "0.0.5"
186
- debuglvl = 7
249
+ debuglvl = 5
187
250
timeout = 600
188
251
defaultspeed = 999999999
189
252
253
+ # content-encoding: gzip
254
+ # contentencoding = "lzma"
255
+ # contentencoding = "gzip"
256
+ contentencoding = None
257
+
258
+
190
259
# dbopen = False
191
260
192
261
def __init__ (self ):
@@ -405,39 +474,49 @@ def _peerupdates(self):
405
474
self ._getpeerupdates (peer ['id' ], selfdoc ["dbmode" ])
406
475
407
476
def _getpeerupdates (self , doc_id , mode ):
408
- self .debugmsg (8 , "doc_id:" , doc_id )
409
- peerdoc = self .readdoc (doc_id )
410
- if "dbserver" in peerdoc :
411
- peerindexes = self ._getremote (peerdoc ["dbserver" ] + "/Index" )
412
- if peerindexes is not None :
413
- self .debugmsg (8 , "peerindexes:" , peerindexes )
414
- for index in peerindexes :
415
- self ._updatepeerindex (peerdoc ["dbserver" ], peerdoc ["dbmode" ], index )
416
- # if mode == "Mirror":
417
- if mode != "Peer" :
418
- peerrevs = self ._getremote (peerdoc ["dbserver" ] + "/Index/rev" )
419
- self .debugmsg (8 , "peerrevs:" , peerrevs )
420
- if peerrevs is not None :
421
- t = datetime .datetime .now ()
422
- for peerrev in peerrevs :
423
- rdet = self ._revdetail (peerrevs [peerrev ])
424
- self .debugmsg (8 , "rdet:" , rdet )
425
- getremote = False
426
- if rdet ["epoch" ] > (t .timestamp () - ONE_YEAR ):
427
- islocal = self ._islocal (peerrev )
428
- if islocal is None :
429
- getremote = True
430
- else :
431
- ldet = self ._revdetail (islocal )
432
- if rdet ["number" ] > ldet ["number" ]:
477
+ doupdate = True
478
+ debuglvl = 8
479
+ self .debugmsg (debuglvl , "doc_id:" , doc_id , " self.doc_id:" , self .doc_id )
480
+ if doc_id != self .doc_id :
481
+ peerdoc = self .readdoc (doc_id )
482
+ self .debugmsg (debuglvl , "peerdoc[dbserver]:" , peerdoc ["dbserver" ], " self.selfurl:" , self .selfurl )
483
+ if peerdoc ["dbserver" ] == self .selfurl :
484
+ doupdate = False
485
+ else :
486
+ doupdate = False
487
+
488
+ if doupdate :
489
+ if "dbserver" in peerdoc :
490
+ peerindexes = self ._getremote (peerdoc ["dbserver" ] + "/Index" )
491
+ if peerindexes is not None :
492
+ self .debugmsg (debuglvl , "peerindexes:" , peerindexes )
493
+ for index in peerindexes :
494
+ self ._updatepeerindex (peerdoc ["dbserver" ], peerdoc ["dbmode" ], index )
495
+ # if mode == "Mirror":
496
+ if mode != "Peer" :
497
+ peerrevs = self ._getremote (peerdoc ["dbserver" ] + "/Index/rev" )
498
+ self .debugmsg (debuglvl , "peerrevs:" , peerrevs )
499
+ if peerrevs is not None :
500
+ t = datetime .datetime .now ()
501
+ for peerrev in peerrevs :
502
+ rdet = self ._revdetail (peerrevs [peerrev ])
503
+ self .debugmsg (debuglvl , "rdet:" , rdet )
504
+ getremote = False
505
+ if rdet ["epoch" ] > (t .timestamp () - ONE_YEAR ):
506
+ islocal = self ._islocal (peerrev )
507
+ if islocal is None :
433
508
getremote = True
509
+ else :
510
+ ldet = self ._revdetail (islocal )
511
+ if rdet ["number" ] > ldet ["number" ]:
512
+ getremote = True
434
513
435
- self .debugmsg (8 , "getremote:" , getremote )
436
- if getremote :
437
- self .debugmsg (8 , "_getremote url:" , peerdoc ["dbserver" ] + "/Doc/" + peerrev )
438
- rdoc = self ._getremote (peerdoc ["dbserver" ] + "/Doc/" + peerrev )
439
- self .debugmsg (8 , "rdoc:" , rdoc )
440
- self ._saveremotedoc (rdoc )
514
+ self .debugmsg (debuglvl , "getremote:" , getremote )
515
+ if getremote :
516
+ self .debugmsg (debuglvl , "_getremote url:" , peerdoc ["dbserver" ] + "/Doc/" + peerrev )
517
+ rdoc = self ._getremote (peerdoc ["dbserver" ] + "/Doc/" + peerrev )
518
+ self .debugmsg (debuglvl , "rdoc:" , rdoc )
519
+ self ._saveremotedoc (rdoc )
441
520
442
521
443
522
def _updatepeerindex (self , peerurl , mode , index ):
@@ -483,22 +562,55 @@ def _updatepeerindex(self, peerurl, mode, index):
483
562
484
563
485
564
def _getremote (self , uri ):
565
+ debuglvl = 4
486
566
try :
487
- r = requests .get (uri , timeout = self .timeout )
488
- self .debugmsg (9 , "resp: " , r .status_code , "r.text:" , r .text )
567
+ self .debugmsg (debuglvl , "uri: " , uri )
568
+ r = requests .get (uri , timeout = self .timeout , stream = True )
569
+ # r = requests.get(uri, timeout=self.timeout)
570
+ self .debugmsg (debuglvl , "r: " , r )
571
+ self .debugmsg (debuglvl , "resp: " , r .status_code , "r.text:" , r .text )
572
+ self .debugmsg (debuglvl , "r.headers: " , r .headers )
573
+
489
574
if (r .status_code != requests .codes .ok ):
490
- self .debugmsg (9 , "r.status_code:" , r .status_code , "!=" , requests .codes .ok )
575
+ self .debugmsg (debuglvl , "r.status_code:" , r .status_code , "!=" , requests .codes .ok )
491
576
return None
492
577
else :
493
- if "{" in r .text or "[" in r .text :
494
- jsonresp = json .loads (r .text )
495
- self .debugmsg (9 , "jsonresp: " , jsonresp )
578
+ self .debugmsg (debuglvl , "r.headers: " , r .headers )
579
+ bodytxt = r .text
580
+ # self.debugmsg(debuglvl, "r.text: ", r.text)
581
+ # content-encoding: gzip
582
+ # contentencoding = "lzma"
583
+ cl = 0
584
+ # content-length: 1016
585
+ if "Content-Length" in r .headers :
586
+ cl = r .headers ["Content-Length" ]
587
+ # self.debugmsg(debuglvl, "cl: ", cl)
588
+ if "Content-Encoding" in r .headers :
589
+
590
+ # r.raw.read(10)
591
+ self .debugmsg (debuglvl , "cl: " , cl )
592
+ self .debugmsg (debuglvl , "r.raw: " , r .raw )
593
+ # bodyraw = r.raw.read(cl)
594
+ # bodyraw = r.raw.read(10)
595
+ bodyraw = r .content
596
+ self .debugmsg (debuglvl , "bodyraw: " , bodyraw )
597
+
598
+ if r .headers ["Content-Encoding" ].lower () == "lzma" :
599
+ # bbodytxt = bytes(bodytxt, "utf-8")
600
+ # bbodytxt = bodytxt.encode()
601
+ bodytxt = lzma .decompress (bodyraw )
602
+ # if r.headers["Content-Encoding"].lower() == "gzip":
603
+ # bodytxt = gzip.decompress(bodytxt)
604
+
605
+ if "{" in bodytxt or "[" in bodytxt :
606
+ jsonresp = json .loads (bodytxt )
607
+ self .debugmsg (debuglvl , "jsonresp: " , jsonresp )
496
608
return jsonresp
497
609
else :
498
- return r . text
610
+ return bodytxt
499
611
500
612
except Exception as e :
501
- self .debugmsg (8 , "Exception:" , e )
613
+ self .debugmsg (debuglvl , "Exception:" , e )
502
614
return None
503
615
504
616
def _sendremote (self , uri , payload ):
0 commit comments