So, nun hab ich mal was gebastelt... Es erscheint eine Webseite mit einem Formular, um zu testen, ob die GET/POST daten richtig verarbeitet werden...
inetd_test.py
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-
import os,sys
class CGI_data_Parser:
"""
parsen/speichern und abrufen der POST/GET Daten
"""
def __init__( self ):
self.data = {}
self.content_length_bytes = 0
def content_length( self, content_length_line ):
"Holt sich die POST-Daten aus dem HTML-Header"
self.content_length_bytes = int( content_length_line.split(":")[1] )
def parse_POST_data( self ):
"Eine POST-Zeile in self.data speichern"
#~ sys.stdin.readline() # Leerzeile zwischen Header und POST-Daten überspringen
POST_data = sys.stdin.read( self.content_length_bytes )
for i in POST_data.split("&"):
item = i.split("=")
if len(item) == 2:
self.data[ item[0] ] = item[1]
else:
print "Fehler:", item
def parse_GET_data( self, GET_data_line ):
"ermittelt die GET-Daten aus der Request-Zeile und speicher sie in self.data"
# GET-Daten vorhanden ?
if not "?" in GET_data_line: return
GET_data = GET_data_line.split("?")[1]
GET_data = GET_data.rsplit(" ",1)[0]
for item in GET_data.split("&"):
item = item.split("=")
if len(item) == 2:
self.data[ item[0] ] = item[1]
else:
self.data[ item[0] ] = ""
def get_data( self ):
return self.data
class environ_data_Parser:
"""
Speichert die environ-Daten
"""
def __init__( self ):
self.data = {}
def parse( self, line ):
line = line.split(":")
line = [i.strip() for i in line]
if len(line) == 2:
self.data[ line[0] ] = line[1]
def get_data( self ):
return self.data
if __name__ == "__main__":
print "HTTP/1.1 200 OK"
print "Content-Type: text/html\n"
print "<hr><pre>"
MyCGIdata = CGI_data_Parser()
MyEnvironData = environ_data_Parser()
for i in xrange(20):
line = sys.stdin.readline()
if line == "\r\n": break
MyEnvironData.parse( line )
if "POST" in line:
MyCGIdata.parse_GET_data( line )
elif "content-length" in line.lower():
MyCGIdata.content_length( line )
print line.replace("\n","")
MyCGIdata.parse_POST_data()
print "\n*** CGI-daten ***"
for k,v in MyCGIdata.get_data().iteritems():
print k,":",v
print "\n*** Environ-Data ***"
for k,v in MyEnvironData.get_data().iteritems():
print k,":",v
print "</pre><hr>"
print """<form name="form" id="form" method="post" action="inetd_test.py?GET1=jo&GET2=buh&biii">
<input name="feld1" type="text" size="20" />
<input name="feld2" type="text" size="20" /></p>
<input type="submit" name="Submit" value="Senden" />
</form>"""
Dabei ist mir aufgefallen, das man besser mit
if "content-length" in line.lower() abfragen sollte... Zwar spuckt Firefox und IE richtig "Content-
Length" aus, aber wenn man mit Python's urllib2.urlopen() eine Anfrage stellt, wird "Content-
length" geschrieben...
EDIT:
Das ganze funktioniert nun, s.
http://python.sandtner.org/viewtopic.php?p=17056#17056