[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Pulp-list] unicode strings in our request URLs



For those that remember the baffling errors you sometimes have to debug where Apache barfs with:

[Fri Oct 29 11:09:46 2010] [error] [client 127.0.0.1] Invalid method in request P

in your ssl_error_log ...

and your pulp client bombs with:

Traceback (most recent call last):
  File "/usr/bin/pulp-admin", line 7, in <module>
    execfile(__file__)
...
  File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

leaving you with no real way to figure out what is going on other than to bang your head against the wall and hope that you remembered that according to RFC 1738:

http://www.faqs.org/rfcs/rfc1738.html

"URLs are written only with the graphic printable characters of the
   US-ASCII coded character set."

and

" Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
   reserved characters used for their reserved purposes may be used
   unencoded within a URL."

To fix this we have done this in our code:

connection.py:        method = "/consumers/%s/" % str(id)
connection.py:        method = "/consumers/%s/packages/" % str(id)
connection.py:        method = "/consumers/%s/certificate/" % str(id)
connection.py:        method = "/consumers/%s/keyvalues/" % str(id)
connection.py:        method = "/consumergroups/%s/" % str(id)
connection.py:        method = "/users/%s/" % str(login)

note the str() wrapping the param.

Instead of forcing our developers to remember todo this why don't we just do the following in connection.py:

diff --git a/src/pulp/client/connection.py b/src/pulp/client/connection.py
index 0067dbb..6d4b75c 100644
--- a/src/pulp/client/connection.py
+++ b/src/pulp/client/connection.py
@@ -106,7 +106,9 @@ class Restlib(object):
         self.key_file = key_file

     def _request(self, request_type, method, info=None):
-        handler = method
+        # Convert the method (path) into a string so we dont
+        # have any unicode characters in the URL
+        handler = str(method)
         if not handler.startswith(self.apihandler):
             #handler = self.apihandler + handler
             handler = '/'.join((self.apihandler, handler))


Any objections?

Mike


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]