~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/HttpServer.py

(mbp) integrated 0.15 fixes: http redirection, dirstate validation, move in dirstate

Show diffs side-by-side

added added

removed removed

Lines of Context:
43
43
class TestingHTTPRequestHandler(SimpleHTTPRequestHandler):
44
44
 
45
45
    def log_message(self, format, *args):
46
 
        self.server.test_case.log('webserver - %s - - [%s] %s "%s" "%s"',
47
 
                                  self.address_string(),
48
 
                                  self.log_date_time_string(),
49
 
                                  format % args,
50
 
                                  self.headers.get('referer', '-'),
51
 
                                  self.headers.get('user-agent', '-'))
 
46
        tcs = self.server.test_case_server
 
47
        tcs.log('webserver - %s - - [%s] %s "%s" "%s"',
 
48
                self.address_string(),
 
49
                self.log_date_time_string(),
 
50
                format % args,
 
51
                self.headers.get('referer', '-'),
 
52
                self.headers.get('user-agent', '-'))
52
53
 
53
54
    def handle_one_request(self):
54
55
        """Handle a single HTTP request.
153
154
            self.end_headers()
154
155
            self.send_range_content(file, start, end - start + 1)
155
156
            self.wfile.write("--%s\r\n" % boundary)
156
 
            pass
157
157
 
158
158
    def do_GET(self):
159
159
        """Serve a GET request.
248
248
 
249
249
 
250
250
class TestingHTTPServer(BaseHTTPServer.HTTPServer):
251
 
    def __init__(self, server_address, RequestHandlerClass, test_case):
 
251
 
 
252
    def __init__(self, server_address, RequestHandlerClass,
 
253
                 test_case_server):
252
254
        BaseHTTPServer.HTTPServer.__init__(self, server_address,
253
 
                                                RequestHandlerClass)
254
 
        self.test_case = test_case
 
255
                                           RequestHandlerClass)
 
256
        # test_case_server can be used to communicate between the
 
257
        # tests and the server (or the request handler and the
 
258
        # server), allowing dynamic behaviors to be defined from
 
259
        # the tests cases.
 
260
        self.test_case_server = test_case_server
255
261
 
256
262
 
257
263
class HttpServer(Server):
267
273
    def __init__(self, request_handler=TestingHTTPRequestHandler):
268
274
        Server.__init__(self)
269
275
        self.request_handler = request_handler
 
276
        self.host = 'localhost'
 
277
        self.port = 0
 
278
        self._httpd = None
270
279
 
271
280
    def _get_httpd(self):
272
 
        return TestingHTTPServer(('localhost', 0),
273
 
                                  self.request_handler,
274
 
                                  self)
 
281
        if self._httpd is None:
 
282
            self._httpd = TestingHTTPServer((self.host, self.port),
 
283
                                            self.request_handler,
 
284
                                            self)
 
285
            host, self.port = self._httpd.socket.getsockname()
 
286
        return self._httpd
275
287
 
276
288
    def _http_start(self):
277
 
        httpd = None
278
289
        httpd = self._get_httpd()
279
 
        host, self.port = httpd.socket.getsockname()
280
 
        self._http_base_url = '%s://localhost:%s/' % (self._url_protocol,
281
 
                                                      self.port)
 
290
        self._http_base_url = '%s://%s:%s/' % (self._url_protocol,
 
291
                                               self.host,
 
292
                                               self.port)
282
293
        self._http_starting.release()
283
294
        httpd.socket.settimeout(0.1)
284
295