11308: Fix string/bytes confusion for Python 3
[arvados.git] / sdk / python / tests / keepstub.py
index d79788c07e3ef4d26d055e6d72a8a59f755c66ae..0bb074cec3711040e5d90c196da113ef0691bb90 100644 (file)
@@ -1,11 +1,16 @@
-import BaseHTTPServer
+from __future__ import division
+from future import standard_library
+standard_library.install_aliases()
+from builtins import str
+import http.server
 import hashlib
 import os
 import re
-import SocketServer
+import socketserver
+import sys
 import time
 
-class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer, object):
+class Server(socketserver.ThreadingMixIn, http.server.HTTPServer, object):
 
     allow_reuse_address = 1
 
@@ -32,7 +37,7 @@ class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer, object):
 
     def setdelays(self, **kwargs):
         """In future requests, induce delays at the given checkpoints."""
-        for (k, v) in kwargs.iteritems():
+        for (k, v) in kwargs.items():
             self.delays.get(k) # NameError if unknown key
             self.delays[k] = v
 
@@ -54,12 +59,12 @@ class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer, object):
         self._sleep_at_least(self.delays[k])
 
 
-class Handler(BaseHTTPServer.BaseHTTPRequestHandler, object):
+class Handler(http.server.BaseHTTPRequestHandler, object):
     def wfile_bandwidth_write(self, data_to_write):
         if self.server.bandwidth == None and self.server.delays['mid_write'] == 0:
             self.wfile.write(data_to_write)
         else:
-            BYTES_PER_WRITE = int(self.server.bandwidth/4.0) or 32768
+            BYTES_PER_WRITE = int(self.server.bandwidth/4) or 32768
             outage_happened = False
             num_bytes = len(data_to_write)
             num_sent_bytes = 0
@@ -83,8 +88,8 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler, object):
         if self.server.bandwidth == None and self.server.delays['mid_read'] == 0:
             return self.rfile.read(bytes_to_read)
         else:
-            BYTES_PER_READ = int(self.server.bandwidth/4.0) or 32768
-            data = ''
+            BYTES_PER_READ = int(self.server.bandwidth/4) or 32768
+            data = b''
             outage_happened = False
             bytes_read = 0
             target_time = time.time()
@@ -135,15 +140,21 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler, object):
         self.end_headers()
         self.server._do_delay('response_close')
 
-    def do_PUT(self):
+    def handle_expect_100(self):
         self.server._do_delay('request_body')
-        # The comments at https://bugs.python.org/issue1491 implies that Python
-        # 2.7 BaseHTTPRequestHandler was patched to support 100 Continue, but
-        # reading the actual code that ships in Debian it clearly is not, so we
-        # need to send the response on the socket directly.
-        self.wfile_bandwidth_write("%s %d %s\r\n\r\n" %
-                         (self.protocol_version, 100, "Continue"))
-        data = self.rfile_bandwidth_read(int(self.headers.getheader('content-length')))
+
+    def do_PUT(self):
+        if sys.version_info < (3, 0):
+            # The comments at https://bugs.python.org/issue1491
+            # implies that Python 2.7 BaseHTTPRequestHandler was
+            # patched to support 100 Continue, but reading the actual
+            # code that ships in Debian it clearly is not, so we need
+            # to send the response on the socket directly.
+            self.server._do_delay('request_body')
+            self.wfile.write("{} {} {}\r\n\r\n".format(
+                self.protocol_version, 100, "Continue"))
+        data = self.rfile_bandwidth_read(
+            int(self.headers.get('content-length')))
         datahash = hashlib.md5(data).hexdigest()
         self.server.store[datahash] = data
         self.server._do_delay('response')