[Checkins] SVN: z3c.json/trunk/ Refactor BasicAuthTransport to reuse as much as possible from Transport

Adam Groszer agroszer at gmail.com
Sun Aug 29 13:07:26 EDT 2010


Log message for revision 115996:
  Refactor BasicAuthTransport to reuse as much as possible from Transport
  that enables to do a simple SafeBasicAuthTransport
  

Changed:
  U   z3c.json/trunk/CHANGES.txt
  U   z3c.json/trunk/buildout.cfg
  U   z3c.json/trunk/src/z3c/json/tests.py
  U   z3c.json/trunk/src/z3c/json/transport.py

-=-
Modified: z3c.json/trunk/CHANGES.txt
===================================================================
--- z3c.json/trunk/CHANGES.txt	2010-08-29 16:23:40 UTC (rev 115995)
+++ z3c.json/trunk/CHANGES.txt	2010-08-29 17:07:26 UTC (rev 115996)
@@ -5,7 +5,8 @@
 0.5.3dev (unreleased)
 ---------------------
 
-- ...
+- Refactor BasicAuthTransport to reuse as much as possible from Transport
+  that enables to do a simple SafeBasicAuthTransport
 
 
 0.5.2 (2009-02-24)

Modified: z3c.json/trunk/buildout.cfg
===================================================================
--- z3c.json/trunk/buildout.cfg	2010-08-29 16:23:40 UTC (rev 115995)
+++ z3c.json/trunk/buildout.cfg	2010-08-29 17:07:26 UTC (rev 115996)
@@ -1,11 +1,16 @@
 [buildout]
 develop = .
-parts = test checker coverage
+parts = test checker coverage coverage-test
 
 [test]
 recipe = zc.recipe.testrunner
 eggs = z3c.json [test]
 
+[coverage-test]
+recipe = zc.recipe.testrunner
+eggs = ${test:eggs}
+defaults = ['--coverage', '../../coverage']
+
 [checker]
 recipe = lovely.recipe:importchecker
 path = src/z3c/json

Modified: z3c.json/trunk/src/z3c/json/tests.py
===================================================================
--- z3c.json/trunk/src/z3c/json/tests.py	2010-08-29 16:23:40 UTC (rev 115995)
+++ z3c.json/trunk/src/z3c/json/tests.py	2010-08-29 17:07:26 UTC (rev 115996)
@@ -38,6 +38,7 @@
 from z3c.json.exceptions import ResponseError, ProtocolError
 
 from z3c.json.proxy import JSONRPCProxy
+from z3c.json.transport import BasicAuthTransport
 
 
 def spaceless(aString):
@@ -546,6 +547,8 @@
 
         global last_request_body
         last_request_body = body
+        global last_request_headers
+        last_request_headers = self.headers
 
         global next_response_body
         global next_response_status
@@ -596,6 +599,10 @@
     global last_request_body
     return last_request_body
 
+def get_last_headers():
+    global last_request_headers
+    return last_request_headers
+
 def serve_requests(server):
     global json_test_server_stop
     while not json_test_server_stop:
@@ -668,6 +675,46 @@
         else:
             self.fail("ResponseError expected")
 
+    def testSimpleBasicAuth(self):
+        transport = BasicAuthTransport('user','passwd')
+
+        proxy = JSONRPCProxy('http://localhost:%d/' % self.TEST_PORT,
+                             transport=transport)
+        set_next_response_json(True, "jsonrpc")
+        y = proxy.hello()
+        self.assertEqual(y, True)
+
+        x = get_last_request()
+        self.assertEqual(x,
+            """{"params":[],"jsonrpc":"2.0","method":"hello","id":"jsonrpc"}""")
+        x = get_last_headers()
+        self.assertEqual(x['authorization'],
+                         'Basic dXNlcjpwYXNzd2Q=')
+
+        set_next_response_json(123, "jsonrpc")
+        y = proxy.greeting(u'Jessy')
+        self.assertEqual(y, 123)
+
+        x = get_last_request()
+        self.assertEqual(x,
+            """{"params":["Jessy"],"jsonrpc":"2.0","method":"greeting","id":"jsonrpc"}""")
+
+        set_next_response('blabla')
+        try:
+            y = proxy.hello()
+        except ResponseError:
+            pass
+        else:
+            self.fail("ResponseError expected")
+
+        set_next_response('{blabla}')
+        try:
+            y = proxy.hello()
+        except ResponseError:
+            pass
+        else:
+            self.fail("ResponseError expected")
+
     dataToTest = [
         {'response_json': True,
          'call_method': 'hello',

Modified: z3c.json/trunk/src/z3c/json/transport.py
===================================================================
--- z3c.json/trunk/src/z3c/json/transport.py	2010-08-29 16:23:40 UTC (rev 115995)
+++ z3c.json/trunk/src/z3c/json/transport.py	2010-08-29 17:07:26 UTC (rev 115996)
@@ -228,35 +228,14 @@
         self.password=password
         self.verbose=verbose
 
-    def request(self, host, handler, request_body, verbose=0):
-        # issue JSON-RPC request
-
-        self.verbose = verbose
-
-        h = httplib.HTTP(host)
-        h.putrequest("POST", handler)
-
-        # required by HTTP/1.1
-        h.putheader("Host", host)
-
-        # required by JSON-RPC
-        h.putheader("User-Agent", self.user_agent)
-        h.putheader("Content-Type", "application/json")
-        h.putheader("Content-Length", str(len(request_body)))
-
-        # basic auth
+    def send_content(self, connection, request_body):
+        # send basic auth
         if self.username is not None and self.password is not None:
-            h.putheader("AUTHORIZATION", "Basic %s" %
+            connection.putheader("AUTHORIZATION", "Basic %s" %
                 base64.encodestring("%s:%s" % (self.username, self.password)
                     ).replace("\012", ""))
-        h.endheaders()
 
-        if request_body:
-            h.send(request_body)
+        Transport.send_content(self, connection, request_body)
 
-        errcode, errmsg, headers = h.getreply()
-
-        if errcode != 200:
-            raise ProtocolError(host + handler, errcode, errmsg, headers)
-
-        return self.parse_response(h.getfile())
+class SafeBasicAuthTransport(SafeTransport, BasicAuthTransport):
+    """Basic AUTH through HTTPS"""
\ No newline at end of file



More information about the checkins mailing list