How Can I Debug Post Requests With Python's Basehttpserver / Simplehttpserver?
I found a script on this site for running a simple server via the command line with python. I added some print lines in because I'd like to print out the GET and POST parameters vi
Solution 1:
It's not tremendously obvious, but the handler is using sockets behind the scenes. So you need to read the raw data from the socket, and then interpret it.
Use the urlparse
module.
- In Python 2, you want
urlparse.parse_qs
. - In Python 3, the library is renamed: you want
urllib.parse.parse_qs
.
Import urlparse
, and then modify your do_POST
method like so:
defdo_POST(s):
"""Respond to a POST request."""# Extract and print the contents of the POST
length = int(s.headers['Content-Length'])
post_data = urlparse.parse_qs(s.rfile.read(length).decode('utf-8'))
for key, value in post_data.iteritems():
print"%s=%s" % (key, value)
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
...
Set up a simple test client:
#!/usr/bin/env pythonimport urllib
import urllib2
url = 'http://localhost:9000'
post_dict = {'foo' : 1,
'bar' : 2,
'bis' : 3}
params = urllib.urlencode(post_dict)
post_req = urllib2.Request(url)
post_req.add_data(params)
response = urllib2.urlopen(post_req)
response_data = response.read()
response.close()
print response_data
Start the server, and then run the client:
ire@localhost$ python http_server.py
Wed Oct 321:38:512012 Server Starts - localhost:9000
foo=[u'1']
bar=[u'2']
bis=[u'3']
Solution 2:
You can use cgi
module instead of urlparse
. cgi
implements POST params parsing out of the box. Using well-tested libraries seems better.
import cgi
defdo_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={"REQUEST_METHOD": "POST"}
)
for item in form.list:
print"%s=%s" % (item.name, item.value)
Post a Comment for "How Can I Debug Post Requests With Python's Basehttpserver / Simplehttpserver?"