comparison mercurial/hgweb/server.py @ 10643:1874697a8863

server: unnest server classes into module namespace
author Dirkjan Ochtman <djc.ochtman@kentyde.com>
date Thu, 11 Mar 2010 13:32:43 +0100
parents 812b85d02c92
children 63948e7d37f7
comparison
equal deleted inserted replaced
10642:812b85d02c92 10643:1874697a8863
203 _mixin = SocketServer.ForkingMixIn 203 _mixin = SocketServer.ForkingMixIn
204 else: 204 else:
205 class _mixin: 205 class _mixin:
206 pass 206 pass
207 207
208 def openlog(opt, default):
209 if opt and opt != '-':
210 return open(opt, 'a')
211 return default
212
213 class MercurialHTTPServer(object, _mixin, BaseHTTPServer.HTTPServer):
214
215 # SO_REUSEADDR has broken semantics on windows
216 if os.name == 'nt':
217 allow_reuse_address = 0
218
219 def __init__(self, ui, app, addr, handler, **kwargs):
220 BaseHTTPServer.HTTPServer.__init__(self, addr, handler, **kwargs)
221 self.daemon_threads = True
222 self.application = app
223
224 ssl_cert = ui.config('web', 'certificate')
225 if ssl_cert:
226 try:
227 from OpenSSL import SSL
228 ctx = SSL.Context(SSL.SSLv23_METHOD)
229 except ImportError:
230 raise util.Abort(_("SSL support is unavailable"))
231 ctx.use_privatekey_file(ssl_cert)
232 ctx.use_certificate_file(ssl_cert)
233 sock = socket.socket(self.address_family, self.socket_type)
234 self.socket = SSL.Connection(ctx, sock)
235 self.server_bind()
236 self.server_activate()
237
238 prefix = ui.config('web', 'prefix', '')
239 if prefix:
240 prefix = '/' + prefix.strip('/')
241 self.prefix = prefix
242
243 alog = openlog(ui.config('web', 'accesslog', '-'), sys.stdout)
244 elog = openlog(ui.config('web', 'errorlog', '-'), sys.stderr)
245 self.accesslog = alog
246 self.errorlog = elog
247
248 self.addr, self.port = self.socket.getsockname()[0:2]
249 self.fqaddr = socket.getfqdn(addr[0])
250
251 class IPv6HTTPServer(MercurialHTTPServer):
252 address_family = getattr(socket, 'AF_INET6', None)
253 def __init__(self, *args, **kwargs):
254 if self.address_family is None:
255 raise error.RepoError(_('IPv6 is not available on this system'))
256 super(IPv6HTTPServer, self).__init__(*args, **kwargs)
257
208 def create_server(ui, repo): 258 def create_server(ui, repo):
209
210 def openlog(opt, default):
211 if opt and opt != '-':
212 return open(opt, 'a')
213 return default
214 259
215 if repo is None: 260 if repo is None:
216 myui = ui 261 myui = ui
217 else: 262 else:
218 myui = repo.ui 263 myui = repo.ui
219 address = myui.config("web", "address", "") 264 address = myui.config("web", "address", "")
220 port = int(myui.config("web", "port", 8000)) 265 port = int(myui.config("web", "port", 8000))
221
222 class MercurialHTTPServer(object, _mixin, BaseHTTPServer.HTTPServer):
223
224 # SO_REUSEADDR has broken semantics on windows
225 if os.name == 'nt':
226 allow_reuse_address = 0
227
228 def __init__(self, ui, app, *args, **kargs):
229 BaseHTTPServer.HTTPServer.__init__(self, *args, **kargs)
230 self.daemon_threads = True
231 self.application = app
232
233 ssl_cert = ui.config('web', 'certificate')
234 if ssl_cert:
235 try:
236 from OpenSSL import SSL
237 ctx = SSL.Context(SSL.SSLv23_METHOD)
238 except ImportError:
239 raise util.Abort(_("SSL support is unavailable"))
240 ctx.use_privatekey_file(ssl_cert)
241 ctx.use_certificate_file(ssl_cert)
242 sock = socket.socket(self.address_family, self.socket_type)
243 self.socket = SSL.Connection(ctx, sock)
244 self.server_bind()
245 self.server_activate()
246
247 prefix = ui.config('web', 'prefix', '')
248 if prefix:
249 prefix = '/' + prefix.strip('/')
250 self.prefix = prefix
251
252 alog = openlog(ui.config('web', 'accesslog', '-'), sys.stdout)
253 elog = openlog(ui.config('web', 'errorlog', '-'), sys.stderr)
254 self.accesslog = alog
255 self.errorlog = elog
256
257 self.addr, self.port = self.socket.getsockname()[0:2]
258 self.fqaddr = socket.getfqdn(address)
259
260 class IPv6HTTPServer(MercurialHTTPServer):
261 address_family = getattr(socket, 'AF_INET6', None)
262
263 def __init__(self, *args, **kwargs):
264 if self.address_family is None:
265 raise error.RepoError(_('IPv6 is not available on this system'))
266 super(IPv6HTTPServer, self).__init__(*args, **kwargs)
267 266
268 if myui.config('web', 'certificate'): 267 if myui.config('web', 'certificate'):
269 handler = _shgwebhandler 268 handler = _shgwebhandler
270 else: 269 else:
271 handler = _hgwebhandler 270 handler = _hgwebhandler