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