Index: net/tools/testserver/testserver.py |
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py |
index 94ad3da7269230fef68be66402d161b07b8cb0f9..8e3df5ea4a345996c1e86ca6b92af6ca9ad2389d 100644 |
--- a/net/tools/testserver/testserver.py |
+++ b/net/tools/testserver/testserver.py |
@@ -1,5 +1,5 @@ |
#!/usr/bin/python2.4 |
-# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+# Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
@@ -22,9 +22,13 @@ import shutil |
import SocketServer |
import sys |
import time |
+import urllib2 |
+ |
+import pyftpdlib.ftpserver |
import tlslite |
import tlslite.api |
-import pyftpdlib.ftpserver |
+ |
+import chromiumsync |
try: |
import hashlib |
@@ -125,12 +129,14 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
self.ContentTypeHandler, |
self.ServerRedirectHandler, |
self.ClientRedirectHandler, |
+ self.ChromiumSyncTimeHandler, |
self.MultipartHandler, |
self.DefaultResponseHandler] |
self._post_handlers = [ |
self.WriteFile, |
self.EchoTitleHandler, |
self.EchoAllHandler, |
+ self.ChromiumSyncCommandHandler, |
self.EchoHandler] + self._get_handlers |
self._put_handlers = [ |
self.WriteFile, |
@@ -149,6 +155,8 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, |
client_address, |
socket_server) |
+ # Class variable; shared across requests. |
+ _sync_handler = chromiumsync.TestServer() |
def _ShouldHandleRequest(self, handler_name): |
"""Determines if the path can be handled by the handler. |
@@ -996,6 +1004,39 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
return True |
+ def ChromiumSyncTimeHandler(self): |
+ """Handle Chromium sync .../time requests. |
+ |
+ The syncer sometimes checks server reachability by examining /time. |
+ """ |
+ test_name = "/chromiumsync/time" |
+ if not self._ShouldHandleRequest(test_name): |
+ return False |
+ |
+ self.send_response(200) |
+ self.send_header('Content-type', 'text/html') |
+ self.end_headers() |
+ return True |
+ |
+ def ChromiumSyncCommandHandler(self): |
+ """Handle a chromiumsync command arriving via http. |
+ |
+ This covers all sync protocol commands: authentication, getupdates, and |
+ commit. |
+ """ |
+ test_name = "/chromiumsync/command" |
+ if not self._ShouldHandleRequest(test_name): |
+ return False |
+ |
+ length = int(self.headers.getheader('content-length')) |
+ raw_request = self.rfile.read(length) |
+ |
+ http_response, raw_reply = self._sync_handler.HandleCommand(raw_request) |
+ self.send_response(http_response) |
+ self.end_headers() |
+ self.wfile.write(raw_reply) |
+ return True |
+ |
def MultipartHandler(self): |
"""Send a multipart response (10 text/html pages).""" |
test_name = "/multipart" |
@@ -1125,13 +1166,24 @@ def MakeDataDir(): |
# Create the default path to our data dir, relative to the exe dir. |
my_data_dir = os.path.dirname(sys.argv[0]) |
my_data_dir = os.path.join(my_data_dir, "..", "..", "..", "..", |
- "test", "data") |
+ "test", "data") |
#TODO(ibrar): Must use Find* funtion defined in google\tools |
#i.e my_data_dir = FindUpward(my_data_dir, "test", "data") |
return my_data_dir |
+def TryKillingOldServer(port): |
+ # Note that an HTTP /kill request to the FTP server has the effect of |
+ # killing it. |
+ for protocol in ["http", "https"]: |
+ try: |
+ urllib2.urlopen("%s://localhost:%d/kill" % (protocol, port)).read() |
+ print "Killed old server instance on port %d (via %s)" % (port, protocol) |
+ except urllib2.URLError: |
+ # Common case, indicates no server running. |
+ pass |
+ |
def main(options, args): |
# redirect output to a log file so it doesn't spam the unit test output |
logfile = open('testserver.log', 'w') |
@@ -1139,6 +1191,9 @@ def main(options, args): |
port = options.port |
+ # Try to free up the port if there's an orphaned old instance. |
+ TryKillingOldServer(port) |
+ |
if options.server_type == SERVER_HTTP: |
if options.cert: |
# let's make sure the cert file exists. |