Mercurial > hg
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 |