1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2005 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
33
from bzrlib.smart import (
32
from bzrlib.smart import medium, protocol
37
33
from bzrlib.tests import http_server
38
from bzrlib.transport import chroot
34
from bzrlib.transport import (
41
40
class HTTPServerWithSmarts(http_server.HttpServer):
59
58
"""Hand the request off to a smart server instance."""
60
backing = transport.get_transport(
61
self.server.test_case_server._home_dir)
59
backing = get_transport(self.server.test_case_server._home_dir)
62
60
chroot_server = chroot.ChrootServer(backing)
63
chroot_server.start_server()
65
t = transport.get_transport(chroot_server.get_url())
63
t = get_transport(chroot_server.get_url())
66
64
self.do_POST_inner(t)
68
chroot_server.stop_server()
66
chroot_server.tearDown()
70
68
def do_POST_inner(self, chrooted_transport):
71
69
self.send_response(200)
108
106
one. This will currently fail if the primary transport is not
109
107
backed by regular disk files.
112
# These attributes can be overriden or parametrized by daughter clasess if
113
# needed, but must exist so that the create_transport_readonly_server()
114
# method (or any method creating an http(s) server) can propagate it.
115
_protocol_version = None
116
_url_protocol = 'http'
119
110
super(TestCaseWithWebserver, self).setUp()
120
111
self.transport_readonly_server = http_server.HttpServer
122
def create_transport_readonly_server(self):
123
server = self.transport_readonly_server(
124
protocol_version=self._protocol_version)
125
server._url_protocol = self._url_protocol
129
114
class TestCaseWithTwoWebservers(TestCaseWithWebserver):
130
115
"""A support class providing readonly urls on two servers that are http://.
143
128
This is mostly a hook for daughter classes.
145
server = self.transport_secondary_server(
146
protocol_version=self._protocol_version)
147
server._url_protocol = self._url_protocol
130
return self.transport_secondary_server()
150
132
def get_secondary_server(self):
151
133
"""Get the server instance for the secondary transport."""
152
134
if self.__secondary_server is None:
153
135
self.__secondary_server = self.create_transport_secondary_server()
154
self.start_server(self.__secondary_server)
136
self.__secondary_server.setUp()
137
self.addCleanup(self.__secondary_server.tearDown)
155
138
return self.__secondary_server
157
def get_secondary_url(self, relpath=None):
158
base = self.get_secondary_server().get_url()
159
return self._adjust_url(base, relpath)
161
def get_secondary_transport(self, relpath=None):
162
t = transport.get_transport(self.get_secondary_url(relpath))
163
self.assertTrue(t.is_readonly())
167
141
class ProxyServer(http_server.HttpServer):
168
142
"""A proxy test server for http transports."""
242
216
The 'old' server is redirected to the 'new' server.
219
def create_transport_secondary_server(self):
220
"""Create the secondary server redirecting to the primary server"""
221
new = self.get_readonly_server()
222
redirecting = HTTPServerRedirecting()
223
redirecting.redirect_to(new.host, new.port)
246
227
super(TestCaseWithRedirectedWebserver, self).setUp()
247
228
# The redirections will point to the new server
248
229
self.new_server = self.get_readonly_server()
249
# The requests to the old server will be redirected to the new server
230
# The requests to the old server will be redirected
250
231
self.old_server = self.get_secondary_server()
252
def create_transport_secondary_server(self):
253
"""Create the secondary server redirecting to the primary server"""
254
new = self.get_readonly_server()
255
redirecting = HTTPServerRedirecting(
256
protocol_version=self._protocol_version)
257
redirecting.redirect_to(new.host, new.port)
258
redirecting._url_protocol = self._url_protocol
261
def get_old_url(self, relpath=None):
262
base = self.old_server.get_url()
263
return self._adjust_url(base, relpath)
265
def get_old_transport(self, relpath=None):
266
t = transport.get_transport(self.get_old_url(relpath))
267
self.assertTrue(t.is_readonly())
270
def get_new_url(self, relpath=None):
271
base = self.new_server.get_url()
272
return self._adjust_url(base, relpath)
274
def get_new_transport(self, relpath=None):
275
t = transport.get_transport(self.get_new_url(relpath))
276
self.assertTrue(t.is_readonly())
280
234
class AuthRequestHandler(http_server.TestingHTTPRequestHandler):
281
235
"""Requires an authentication to process requests.
363
319
self.send_header(tcs.auth_header_sent,header)
366
class DigestAndBasicAuthRequestHandler(DigestAuthRequestHandler):
367
"""Implements a digest and basic authentication of a request.
369
I.e. the server proposes both schemes and the client should choose the best
370
one it can handle, which, in that case, should be digest, the only scheme
374
def send_header_auth_reqed(self):
375
tcs = self.server.test_case_server
376
self.send_header(tcs.auth_header_sent,
377
'Basic realm="%s"' % tcs.auth_realm)
378
header = 'Digest realm="%s", ' % tcs.auth_realm
379
header += 'nonce="%s", algorithm="%s", qop="auth"' % (tcs.auth_nonce,
381
self.send_header(tcs.auth_header_sent,header)
384
322
class AuthServer(http_server.HttpServer):
385
323
"""Extends HttpServer with a dictionary of passwords.
510
447
self.init_http_auth()
513
class HTTPBasicAndDigestAuthServer(DigestAuthServer, HTTPAuthServer):
514
"""An HTTP server requiring basic or digest authentication"""
516
def __init__(self, protocol_version=None):
517
DigestAuthServer.__init__(self, DigestAndBasicAuthRequestHandler,
519
protocol_version=protocol_version)
520
self.init_http_auth()
521
# We really accept Digest only
522
self.auth_scheme = 'digest'
525
450
class ProxyBasicAuthServer(ProxyAuthServer):
526
451
"""A proxy server requiring basic authentication"""
540
465
self.init_proxy_auth()
543
class ProxyBasicAndDigestAuthServer(DigestAuthServer, ProxyAuthServer):
544
"""An proxy server requiring basic or digest authentication"""
546
def __init__(self, protocol_version=None):
547
DigestAuthServer.__init__(self, DigestAndBasicAuthRequestHandler,
549
protocol_version=protocol_version)
550
self.init_proxy_auth()
551
# We really accept Digest only
552
self.auth_scheme = 'digest'