[zorp-hu] HTTP POST DATA elemzes (AnyPyProxy)
Balazs Scheidler
bazsi at balabit.hu
2007. Május. 23., Sze, 17:42:24 CEST
Szia,
Vegre egy erdekes problema :)
On Wed, 2007-05-23 at 10:56 +0200, Viktor Tuska wrote:
> Udv,
>
> a kovetkezo config-al probalkozom a HTTP forgalom POST tipusu
> request_method-jainak adatat elemezni:
>
> "
> class myHttpProxy(HttpProxy):
>
> def config(self):
> HttpProxy.config(self)
> self.request["POST"] = (HTTP_REQ_POLICY, self.isok)
>
> def isok(self, method, url, version):
> url = unquote(url)
>
> if ( url.find("/xxx/index.php") > -1 ):
> self.request_stack["POST"] = (HTTP_STK_DATA,
> magicProxy )
ez nagyjabol jonak tunik, gondolom a beagyazott proxy meg el is indul.
Ezt a logokbol tudod kideriteni, tenyleg elindult?
>
> class magicProxy(AbstractAnyPyProxy):
>
> def config(self):
> AbstractAnyPyProxy.config(self)
>
> def proxyThread(self):
> client = self.session.client_stream
> server = self.session.server_stream
>
> user = client.read(128)
> #itt majd elkovetek valamit a "user"-el, ha mar
> mukodik... ;)
> server.write(user)
>
> while user:
> try:
> user = client.read(128)
> server.write(user)
> except IOError, e:
> log("http.info", 2, e.__str__());
> break
> "
>
> Jonak tunik ez igy?
Az AnyPy proxy meglehetosen fapados (pl. blocking I/O-t hasznal, tehat
full-duplex csatornakat nem lehet vele lekezelni), de alapvetoen jonak
tunik.
Fontos, hogy a HTTP-nel HTTP_STK_DATA tipusu stackelest kertel, azaz
AnyPy csak az adatreszt fogja megkapni, a HTTP fejleceket nem.
>
> Hogyan tudnek a client_stream hosszanak megfelelo adatot kiolvasni
> mashogyan? (Exception nelkul?)
A stream-nek nincs "hossza", legalabbis elore nem tudhato. Addig kell
olvasnod, ameddig EOF-ot (0 hosszu stringet) nem kapsz.
Latom az exception handler-t, rafut arra valamikor?
> Esetleg hogyan lehetne megadni, hogy csak a "Content-Length"-nek
> megfelelo adatot olvassak a stream-bol? Probaltam kinyerni a kovetkezo
> kodreszlet segitsegevel, de ugy tunik mintha a request_header
> feldolgozasa a request_stack-e utan lenne...
>
> "
> self.request_header["Content-Length"] = (HTTP_HDR_POLICY, self.getlength)
>
> def getlength(self, name, value):
> self.LENGTH = self.current_header_value
> return HTTP_HDR_ACCEPT
> "
Jol alltal neki, sot elvileg a fejlec feldolgozas a stackeles elott van.
Mibol gondolod, hogy nem? Nemi log jol jonne.
Az AnyPy es a Http mas "objektum", igy a self-en keresztul nem tudsz
adatot atadni. Erre valo a session, amit self.session -kent tudsz
elerni.
A beagyazott proxyk latjak a szulo proxy-k session-jeben levo
valtozokat. Tehat pl:
self.session.length = self.current_header_value
Es akkor az AnyPy-ban ugyanugy self.session.length-kent tudsz ra
hivatkozni. (a session-ben levo valtozokra valo hivatkozasrol a
Session.py docstringjeben van egy leiras)
(hint: self.session.http.<valtozo>)
Arra figyelj, hogy Content-Length nem mindig van, bar bongeszo es Apache
eseteben igen. (pl chunked encoding elvileg lehetseges bar az Apache
utolso emlekeim szerint nem tamogatta).
>
> Kiprobaltam es olyan erdekesseget tapasztalok, hogy amikor elkuldom a
> POST kerest, akkor a browser-em nem kap vissza valaszt, pedig log-olva a
> stream-bol megjelenik a POST altal elkuldott adat... Lehet rosszul
> emlekszem, de mintha lett volna olyan allapot, amikor ez mukodott volna,
> de olyan sok variaciot kiprobaltam, hogy sajna mar nem tudom csak
> kepzeltem-e, hogy mukodott... :(
Nemi log segitene itt is.
Ja, megegy. Milyen Zorp verziot hasznalsz?
--
Bazsi
További információk a(z) zorp-hu levelezőlistáról