Comment puis-je déboguer des requêtes POST avec BaseHTTPServer / SimpleHTTPServer de python?
J'ai trouvé un script sur ce site pour l'exécution d'un simple serveur via la ligne de commande avec python.
J'ai ajouté quelques print
lignes parce que je voudrais imprimer GET et POST des paramètres via la ligne de commande pour les demandes, mais je n'arrive pas à obtenir d'eux de montrer n'importe où.
Si j'ai juste l'impression de notre de notre le s
variable (pprint (vars(s))
) j'ai vu ceci:
{'client_address': ('127.0.0.1', 53373),
'close_connection': 1,
'command': 'GET',
'connection': <socket._socketobject object at 0x10b6560c0>,
'headers': <mimetools.Message instance at 0x10b689ab8>,
'path': '/favicon.ico',
'raw_requestline': 'GET /favicon.ico HTTP/1.1\r\n',
'request': <socket._socketobject object at 0x10b6560c0>,
'request_version': 'HTTP/1.1',
'requestline': 'GET /favicon.ico HTTP/1.1',
'rfile': <socket._fileobject object at 0x10b6538d0>,
'server': <BaseHTTPServer.HTTPServer instance at 0x10b6893f8>,
'wfile': <socket._fileobject object at 0x10b6536d0>}
J'ai essayé d'utiliser l' print
de commande avec chacun des indices, (pprint (vars(s.connection))
) mais qui ne fonctionne pas.
Voici le script modifié:
#!/usr/bin/python
import time
import BaseHTTPServer
from pprint import pprint
HOST_NAME = 'localhost' # !!!REMEMBER TO CHANGE THIS!!!
PORT_NUMBER = 9000 # Maybe set this to 9000.
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_HEAD(s):
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
def do_GET(s):
"""Respond to a GET request."""
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
s.wfile.write("<html><head><title>Title goes here.</title></head>")
s.wfile.write("<body><form action='.' method='POST'><input name='x' value='1' /><input type='submit' /></form><p>This is a test.</p>")
# If someone went to "http://something.somewhere.net/foo/bar/",
# then s.path equals "/foo/bar/".
s.wfile.write("<p>GET: You accessed path: %s</p>" % s.path)
s.wfile.write("</body></html>")
pprint (vars(s))
def do_POST(s):
"""Respond to a POST request."""
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
s.wfile.write("<html><head><title>Title goes here.</title></head>")
s.wfile.write("<body><p>This is a test.</p>")
s.wfile.write("<body><form action='.' method='POST'><input type='text' name='xxxxxxxxxxxx' value='0000000000000000000000' /><input type='submit' /></form><p>This is a test.</p>")
# If someone went to "http://something.somewhere.net/foo/bar/",
# then s.path equals "/foo/bar/".
s.wfile.write("<p>POST: You accessed path: %s</p>" % s.path)
s.wfile.write("</body></html>")
pprint (vars(s))
pprint (vars(s.connection))
pprint (vars(s.headers))
pprint (vars(s.request))
pprint (vars(s.rfile))
pprint (vars(s.server))
pprint (vars(s.wfile))
pprint (vars(s.fp))
"""pprint (vars(s.request))"""
if __name__ == '__main__':
server_class = BaseHTTPServer.HTTPServer
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)
Comment puis-je imprimer la POSTE et des paramètres à l'aide d'un simple script?
De sortie désiré via la ligne de commande devrait ressembler à quelque chose comme:
1.0.0.127. - - [03/Oct/2012 16:02:05] "POST /HTTP/1.1" 200 -
foo=1
bar=2
bis=3
source d'informationauteur cwd
Vous devez vous connecter pour publier un commentaire.
Il n'est pas terriblement évident, mais le maître est à l'aide de sockets derrière les coulisses. Si vous avez besoin de lire les données brutes de la prise, puis l'interpréter.
Utiliser le
urlparse
module.urlparse.parse_qs
.urllib.parse.parse_qs
.Importation
urlparse
puis modifier votredo_POST
méthode comme suit:Créé un simple client de test:
Démarrer le serveur, puis exécutez le client:
Vous pouvez utiliser
cgi
module au lieu deurlparse
.cgi
implémente POST params l'analyse de la boîte. En utilisant bien testé les bibliothèques semble mieux.import cgi