[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