12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
- from BaseHTTPServer import BaseHTTPRequestHandler ,HTTPServer
15
+ from SocketServer import BaseServer
16
+ from BaseHTTPServer import BaseHTTPRequestHandler , HTTPServer
16
17
from handlers import MongoHandler
18
+ from OpenSSL import SSL
17
19
18
- import os .path
20
+ import os .path , socket
19
21
import urlparse
20
22
import cgi
21
23
import getopt
27
29
import simplejson as json
28
30
29
31
30
- class MongoServer (BaseHTTPRequestHandler ):
32
+ class MongoServer (HTTPServer ):
33
+
34
+ pem = None
35
+
36
+ def __init__ (self , server_address , HandlerClass ):
37
+ BaseServer .__init__ (self , server_address , HandlerClass )
38
+ ctx = SSL .Context (SSL .SSLv23_METHOD )
39
+
40
+ fpem = MongoServer .pem
41
+ ctx .use_privatekey_file (fpem )
42
+ ctx .use_certificate_file (fpem )
43
+
44
+ self .socket = SSL .Connection (ctx , socket .socket (self .address_family ,
45
+ self .socket_type ))
46
+ self .server_bind ()
47
+ self .server_activate ()
48
+
49
+
50
+ class MongoHTTPRequest (BaseHTTPRequestHandler ):
31
51
32
52
mh = None
33
53
@@ -80,10 +100,10 @@ def call_handler(self, uri, args):
80
100
else :
81
101
name = args .getvalue ("name" )
82
102
83
- func = getattr (MongoServer .mh , func_name , None )
103
+ func = getattr (MongoHTTPRequest .mh , func_name , None )
84
104
if callable (func ):
85
105
self .send_response (200 , 'OK' )
86
- self .send_header ('Content-type' , MongoServer .mimetypes ['json' ])
106
+ self .send_header ('Content-type' , MongoHTTPRequest .mimetypes ['json' ])
87
107
self .end_headers ()
88
108
89
109
func (args , self .wfile .write , name = name , db = db , collection = collection )
@@ -106,7 +126,7 @@ def process_uri(self, method):
106
126
'CONTENT_TYPE' :self .headers ['Content-Type' ]})
107
127
else :
108
128
self .send_response (100 , "Continue" )
109
- self .send_header ('Content-type' , MongoServer .mimetypes ['json' ])
129
+ self .send_header ('Content-type' , MongoHTTPRequest .mimetypes ['json' ])
110
130
self .end_headers ()
111
131
self .wfile .write ('{"ok" : 0, "errmsg" : "100-continue msgs not handled yet"}' )
112
132
@@ -132,12 +152,12 @@ def do_GET(self):
132
152
133
153
# serve up a plain file
134
154
if len (type ) != 0 :
135
- if type in MongoServer .mimetypes and os .path .exists (MongoServer .docroot + uri ):
155
+ if type in MongoHTTPRequest .mimetypes and os .path .exists (MongoHTTPRequest .docroot + uri ):
136
156
137
- fh = open (MongoServer .docroot + uri , 'r' )
157
+ fh = open (MongoHTTPRequest .docroot + uri , 'r' )
138
158
139
159
self .send_response (200 , 'OK' )
140
- self .send_header ('Content-type' , MongoServer .mimetypes [type ])
160
+ self .send_header ('Content-type' , MongoHTTPRequest .mimetypes [type ])
141
161
self .end_headers ()
142
162
self .wfile .write (fh .read ())
143
163
@@ -171,12 +191,16 @@ def serve_forever(port):
171
191
print "\n ================================="
172
192
print "| MongoDB REST Server |"
173
193
print "=================================\n "
174
- print "listening for connections on http://localhost:27080\n "
175
-
176
- MongoServer .mh = MongoHandler ()
177
194
178
- server = HTTPServer (('' , port ), MongoServer )
195
+ if MongoServer .pem == None :
196
+ server = HTTPServer (('' , port ), MongoHTTPRequest )
197
+ else :
198
+ print "--------Secure Connection--------\n "
199
+ server = MongoServer (('' , port ), MongoHTTPSRequest )
179
200
201
+ MongoHTTPRequest .mh = MongoHandler ()
202
+
203
+ print "listening for connections on http://localhost:27080\n "
180
204
try :
181
205
server .serve_forever ()
182
206
except KeyboardInterrupt :
@@ -185,19 +209,34 @@ def serve_forever(port):
185
209
print "\n Good bye!\n "
186
210
187
211
212
+ class MongoHTTPSRequest (MongoHTTPRequest ):
213
+ def setup (self ):
214
+ self .connection = self .request
215
+ self .rfile = socket ._fileobject (self .request , "rb" , self .rbufsize )
216
+ self .wfile = socket ._fileobject (self .request , "wb" , self .wbufsize )
217
+
218
+
219
+ def usage ():
220
+ print "python httpd.py [-d docroot/dir] [-s certificate.pem]"
221
+ print "\t -d|--docroot\t location from which to load files"
222
+ print "\t -s|--secure\t location of .pem file if ssl is desired"
223
+
188
224
if __name__ == "__main__" :
225
+
189
226
try :
190
- opts , args = getopt .getopt (sys .argv [1 :], "d:" , ["docroot=" ])
227
+ opts , args = getopt .getopt (sys .argv [1 :], "d:s: " , ["docroot=" , "secure =" ])
191
228
192
229
for o , a in opts :
193
230
if o == "-d" or o == "--docroot" :
194
231
if not a .endswith ('/' ):
195
232
a = a + '/'
196
- MongoServer .docroot = a
233
+ MongoHTTPRequest .docroot = a
234
+ if o == "-s" or o == "--secure" :
235
+ MongoServer .pem = a
197
236
198
237
except getopt .GetoptError :
199
238
print "error parsing cmd line args."
239
+ usage ()
200
240
sys .exit (2 )
201
241
202
- MongoServer .serve_forever (27080 )
203
-
242
+ MongoHTTPRequest .serve_forever (27080 )
0 commit comments