~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/http_utils.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-05-11 11:47:36 UTC
  • mfrom: (5200.3.8 lock_return)
  • Revision ID: pqm@pqm.ubuntu.com-20100511114736-mc1sq9zyo3vufec7
(lifeless) Provide a consistent interface to Tree, Branch,
 Repository where lock methods return an object with an unlock method to
 unlock the lock. This breaks the API for Branch,
 Repository on their lock_write methods. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
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
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
from cStringIO import StringIO
 
18
import errno
18
19
import re
 
20
import socket
 
21
import threading
 
22
import time
19
23
import urllib2
 
24
import urlparse
20
25
 
21
26
 
22
27
from bzrlib import (
23
28
    errors,
24
29
    osutils,
25
30
    tests,
26
 
    transport,
27
 
    )
28
 
from bzrlib.smart import (
29
 
    medium,
30
 
    )
 
31
    )
 
32
from bzrlib.smart import medium, protocol
31
33
from bzrlib.tests import http_server
32
 
from bzrlib.transport import chroot
 
34
from bzrlib.transport import (
 
35
    chroot,
 
36
    get_transport,
 
37
    )
33
38
 
34
39
 
35
40
class HTTPServerWithSmarts(http_server.HttpServer):
51
56
 
52
57
    def do_POST(self):
53
58
        """Hand the request off to a smart server instance."""
54
 
        backing = transport.get_transport_from_path(
55
 
            self.server.test_case_server._home_dir)
 
59
        backing = get_transport(self.server.test_case_server._home_dir)
56
60
        chroot_server = chroot.ChrootServer(backing)
57
61
        chroot_server.start_server()
58
62
        try:
59
 
            t = transport.get_transport_from_url(chroot_server.get_url())
 
63
            t = get_transport(chroot_server.get_url())
60
64
            self.do_POST_inner(t)
61
65
        finally:
62
66
            chroot_server.stop_server()
102
106
    one. This will currently fail if the primary transport is not
103
107
    backed by regular disk files.
104
108
    """
105
 
 
106
 
    # These attributes can be overriden or parametrized by daughter clasess if
107
 
    # needed, but must exist so that the create_transport_readonly_server()
108
 
    # method (or any method creating an http(s) server) can propagate it.
109
 
    _protocol_version = None
110
 
    _url_protocol = 'http'
111
 
 
112
109
    def setUp(self):
113
110
        super(TestCaseWithWebserver, self).setUp()
114
111
        self.transport_readonly_server = http_server.HttpServer
115
112
 
116
 
    def create_transport_readonly_server(self):
117
 
        server = self.transport_readonly_server(
118
 
            protocol_version=self._protocol_version)
119
 
        server._url_protocol = self._url_protocol
120
 
        return server
121
 
 
122
113
 
123
114
class TestCaseWithTwoWebservers(TestCaseWithWebserver):
124
115
    """A support class providing readonly urls on two servers that are http://.
136
127
 
137
128
        This is mostly a hook for daughter classes.
138
129
        """
139
 
        server = self.transport_secondary_server(
140
 
            protocol_version=self._protocol_version)
141
 
        server._url_protocol = self._url_protocol
142
 
        return server
 
130
        return self.transport_secondary_server()
143
131
 
144
132
    def get_secondary_server(self):
145
133
        """Get the server instance for the secondary transport."""
148
136
            self.start_server(self.__secondary_server)
149
137
        return self.__secondary_server
150
138
 
151
 
    def get_secondary_url(self, relpath=None):
152
 
        base = self.get_secondary_server().get_url()
153
 
        return self._adjust_url(base, relpath)
154
 
 
155
 
    def get_secondary_transport(self, relpath=None):
156
 
        t = transport.get_transport_from_url(self.get_secondary_url(relpath))
157
 
        self.assertTrue(t.is_readonly())
158
 
        return t
159
 
 
160
139
 
161
140
class ProxyServer(http_server.HttpServer):
162
141
    """A proxy test server for http transports."""
236
215
   The 'old' server is redirected to the 'new' server.
237
216
   """
238
217
 
 
218
   def create_transport_secondary_server(self):
 
219
       """Create the secondary server redirecting to the primary server"""
 
220
       new = self.get_readonly_server()
 
221
       redirecting = HTTPServerRedirecting()
 
222
       redirecting.redirect_to(new.host, new.port)
 
223
       return redirecting
 
224
 
239
225
   def setUp(self):
240
226
       super(TestCaseWithRedirectedWebserver, self).setUp()
241
227
       # The redirections will point to the new server
242
228
       self.new_server = self.get_readonly_server()
243
 
       # The requests to the old server will be redirected to the new server
 
229
       # The requests to the old server will be redirected
244
230
       self.old_server = self.get_secondary_server()
245
231
 
246
 
   def create_transport_secondary_server(self):
247
 
       """Create the secondary server redirecting to the primary server"""
248
 
       new = self.get_readonly_server()
249
 
       redirecting = HTTPServerRedirecting(
250
 
           protocol_version=self._protocol_version)
251
 
       redirecting.redirect_to(new.host, new.port)
252
 
       redirecting._url_protocol = self._url_protocol
253
 
       return redirecting
254
 
 
255
 
   def get_old_url(self, relpath=None):
256
 
        base = self.old_server.get_url()
257
 
        return self._adjust_url(base, relpath)
258
 
 
259
 
   def get_old_transport(self, relpath=None):
260
 
        t = transport.get_transport_from_url(self.get_old_url(relpath))
261
 
        self.assertTrue(t.is_readonly())
262
 
        return t
263
 
 
264
 
   def get_new_url(self, relpath=None):
265
 
        base = self.new_server.get_url()
266
 
        return self._adjust_url(base, relpath)
267
 
 
268
 
   def get_new_transport(self, relpath=None):
269
 
        t = transport.get_transport_from_url(self.get_new_url(relpath))
270
 
        self.assertTrue(t.is_readonly())
271
 
        return t
272
 
 
273
232
 
274
233
class AuthRequestHandler(http_server.TestingHTTPRequestHandler):
275
234
    """Requires an authentication to process requests.
284
243
    # - auth_header_recv: the header received containing auth
285
244
    # - auth_error_code: the error code to indicate auth required
286
245
 
287
 
    def _require_authentication(self):
288
 
        # Note that we must update test_case_server *before*
289
 
        # sending the error or the client may try to read it
290
 
        # before we have sent the whole error back.
291
 
        tcs = self.server.test_case_server
292
 
        tcs.auth_required_errors += 1
293
 
        self.send_response(tcs.auth_error_code)
294
 
        self.send_header_auth_reqed()
295
 
        # We do not send a body
296
 
        self.send_header('Content-Length', '0')
297
 
        self.end_headers()
298
 
        return
299
 
 
300
246
    def do_GET(self):
301
247
        if self.authorized():
302
248
            return http_server.TestingHTTPRequestHandler.do_GET(self)
303
249
        else:
304
 
            return self._require_authentication()
305
 
 
306
 
    def do_HEAD(self):
307
 
        if self.authorized():
308
 
            return http_server.TestingHTTPRequestHandler.do_HEAD(self)
309
 
        else:
310
 
            return self._require_authentication()
 
250
            # Note that we must update test_case_server *before*
 
251
            # sending the error or the client may try to read it
 
252
            # before we have sent the whole error back.
 
253
            tcs = self.server.test_case_server
 
254
            tcs.auth_required_errors += 1
 
255
            self.send_response(tcs.auth_error_code)
 
256
            self.send_header_auth_reqed()
 
257
            # We do not send a body
 
258
            self.send_header('Content-Length', '0')
 
259
            self.end_headers()
 
260
            return
311
261
 
312
262
 
313
263
class BasicAuthRequestHandler(AuthRequestHandler):