views:

93

answers:

4

I wrote a small WSGI App:

def foo(environ, start_response):
        bar = 'Your request is %s' % environ['PATH_INFO']
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(bar)))]
        start_response(status, response_headers)
        return [bar]

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    server = make_server('localhost', 8000, foo)
    print "Running..."
    server.serve_forever()

And another script to test:

import urllib2
checkURL = 'http://localhost:8000/foo bar'

print urllib2.urlopen(checkURL).read()

I run script 1 (WSGI App). When run script 2, I has a problem here. WSGI doesn't retrieve request from script 2 (checkURL has a space between foo and bar) and all other request to my WSGI not responding. Now, how do I correct this problem when url request has spaces?

A: 

You should use "%20" in URL's to encode spaces into then -- but don't do that manually: use urllib.quote function, like:

import urllib base = "http://localhost:8000/" path = urllib.quote("foo bar") checkURL = base + path

(there is also the "unquote" function for you to use serverside)

jsbueno
A: 

Update

Typically a WSGI URI will look something like localhost:8000/foo/bar/baz or localhost:8000/?foo=bar and not use spaces, so I suspect that the server is timing out because it doesn't have built-in handling for spaces.

Maybe your question is really "Can I use WSGI with a URI that has spaces?" -- I think the answer is No, as @S.Lott explains that server's front-end should handle this for you; you shouldn't need to worry about spaces in your WSGI app.


Original answer

If replacing spaces is a fix (your reply to my comment seems like it is) , then you can use urllib2.quote() to replace the spaces in your URL with %20, like this:

checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')
jcoon
but, if other programmers use spaces in url request, my system will not responding all other requests
Warpzv
I see, that wasn't clear initially. See my comment to your original question
jcoon
Warpzv
The answer isn't maybe. It's "no". If you use Apache as a front-end for wsgi (via mod_wsgi), Apache will handle this for you.
S.Lott
Agreed - I updated my answer
jcoon
+1  A: 

From http://www.ietf.org/rfc/rfc2396.txt

The space character is excluded because significant spaces may disappear and insignificant spaces may be introduced when URI are transcribed or typeset or subjected to the treatment of word- processing programs. Whitespace is also used to delimit URI in many contexts.

space = <US-ASCII coded character 20 hexadecimal>

Bottom line. No, you cannot use a space. It is not a problem with the WSGI server. It is a problem with your URI.

Further, you should not be using the WSGI server stand-alone. You should be using it embedded in Apache via mod_wsgi. When you do this, Apache will handle the illegal URI requests for you.

S.Lott
A: 

I moved from wsgiref.simple_server to cherrypy and it work well. Client request will time out after about 1s. Thanks jcoon and S.Lott very much!

Warpzv