[Python-es] parsear los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

2012-11-06 Por tema Jose Caballero
Hola,



como ejercicio puramente didáctico (por ahora) estoy haciendo algunas
pruebas con las classes SimpleHTTP* que trae python [tiene que ser
python2.4].
He conseguido arrancar un servicio httpd, y puedo navegar con un 'browser'
por los directorios.
También he averiguado cómo modificar el 'output', escribiendo el contenido
en self.wfile

No he sido capaz de averiguar cómo parsear los datos de 'input' en caso
de una llamada POST.
He añadido un método do_POST():


class MySimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
...
def do_POST(self):
...
self.wfile.write( 'mundo\n' )


Efectivamente, luego puedo hacer

  $ curl -d hola http://www.myserver.net:1234
  mundo
  $

Sin embargo no he sido capaz de averiguar cómo quedarme con los datos de
'input' en una variable. En este caso sencillo simplemente 'hola', pero
podría ser algo más complejo (por ejemplo un diccionario).
Lo estoy intentando con la clase cgi, pero no lo consigo.
No sé si el problema está en el comando curl en si mismo, que no está
completo, o que aún no he encontrado el método de la clase cgi adecuado.

Cualquier pista que me puedan dar será más que bien recibida.



Muchas gracias por adelantado.
Saludos cordiales,
Jose
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] parsear los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

2012-11-06 Por tema Carlos Zuniga
2012/11/6 Jose Caballero jcaballero@gmail.com:
 Hola,



 como ejercicio puramente didáctico (por ahora) estoy haciendo algunas
 pruebas con las classes SimpleHTTP* que trae python [tiene que ser
 python2.4].
 He conseguido arrancar un servicio httpd, y puedo navegar con un 'browser'
 por los directorios.
 También he averiguado cómo modificar el 'output', escribiendo el contenido
 en self.wfile

 No he sido capaz de averiguar cómo parsear los datos de 'input' en caso de
 una llamada POST.
 He añadido un método do_POST():


 class MySimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
 ...
 def do_POST(self):
 ...
 self.wfile.write( 'mundo\n' )


 Efectivamente, luego puedo hacer

   $ curl -d hola http://www.myserver.net:1234
   mundo
   $

 Sin embargo no he sido capaz de averiguar cómo quedarme con los datos de
 'input' en una variable. En este caso sencillo simplemente 'hola', pero
 podría ser algo más complejo (por ejemplo un diccionario).
 Lo estoy intentando con la clase cgi, pero no lo consigo.
 No sé si el problema está en el comando curl en si mismo, que no está
 completo, o que aún no he encontrado el método de la clase cgi adecuado.

 Cualquier pista que me puedan dar será más que bien recibida.

Los datos que se envía por un formulario POST se encuentran en los
headers del request. Dentro de tu método do_POST deberías poder
acceder a self.headers (que es un objeto del tipo MessageClass) para
ver los datos:
http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.headers

Saludos
--
A menudo unas pocas horas de Prueba y error podrán ahorrarte minutos
de leer manuales.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] parsear los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

2012-11-06 Por tema Jose Caballero
El 6 de noviembre de 2012 14:55, Carlos Zuniga carlos@gmail.comescribió:

 2012/11/6 Jose Caballero jcaballero@gmail.com:
  Hola,
 
 
 
  como ejercicio puramente didáctico (por ahora) estoy haciendo algunas
  pruebas con las classes SimpleHTTP* que trae python [tiene que ser
  python2.4].
  He conseguido arrancar un servicio httpd, y puedo navegar con un
 'browser'
  por los directorios.
  También he averiguado cómo modificar el 'output', escribiendo el
 contenido
  en self.wfile
 
  No he sido capaz de averiguar cómo parsear los datos de 'input' en
 caso de
  una llamada POST.
  He añadido un método do_POST():
 
 
  class
 MySimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
  ...
  def do_POST(self):
  ...
  self.wfile.write( 'mundo\n' )
 
 
  Efectivamente, luego puedo hacer
 
$ curl -d hola http://www.myserver.net:1234
mundo
$
 
  Sin embargo no he sido capaz de averiguar cómo quedarme con los datos de
  'input' en una variable. En este caso sencillo simplemente 'hola', pero
  podría ser algo más complejo (por ejemplo un diccionario).
  Lo estoy intentando con la clase cgi, pero no lo consigo.
  No sé si el problema está en el comando curl en si mismo, que no está
  completo, o que aún no he encontrado el método de la clase cgi adecuado.
 
  Cualquier pista que me puedan dar será más que bien recibida.

 Los datos que se envía por un formulario POST se encuentran en los
 headers del request. Dentro de tu método do_POST deberías poder
 acceder a self.headers (que es un objeto del tipo MessageClass) para
 ver los datos:

 http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.headers



Ya había intentado esa vía. Sin embargo, si hago  print self.headers en
do_POST(), esto es lo que obtengo:


User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5
OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: www.myserver.net:1234
Pragma: no-cache
Accept: */*
Content-Length: 4
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
X-BlueCoat-Via: F7D3AB2CA1943FBA


No veo el 'input' por ninguna parte.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] parsear los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

2012-11-06 Por tema Carlos Zuniga
2012/11/6 Jose Caballero jcaballero@gmail.com:


 El 6 de noviembre de 2012 14:55, Carlos Zuniga carlos@gmail.com
 escribió:

 2012/11/6 Jose Caballero jcaballero@gmail.com:
  Hola,
 
 
 
  como ejercicio puramente didáctico (por ahora) estoy haciendo algunas
  pruebas con las classes SimpleHTTP* que trae python [tiene que ser
  python2.4].
  He conseguido arrancar un servicio httpd, y puedo navegar con un
  'browser'
  por los directorios.
  También he averiguado cómo modificar el 'output', escribiendo el
  contenido
  en self.wfile
 
  No he sido capaz de averiguar cómo parsear los datos de 'input' en
  caso de
  una llamada POST.
  He añadido un método do_POST():
 
 
  class
  MySimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
  ...
  def do_POST(self):
  ...
  self.wfile.write( 'mundo\n' )
 
 
  Efectivamente, luego puedo hacer
 
$ curl -d hola http://www.myserver.net:1234
mundo
$
 
  Sin embargo no he sido capaz de averiguar cómo quedarme con los datos de
  'input' en una variable. En este caso sencillo simplemente 'hola', pero
  podría ser algo más complejo (por ejemplo un diccionario).
  Lo estoy intentando con la clase cgi, pero no lo consigo.
  No sé si el problema está en el comando curl en si mismo, que no está
  completo, o que aún no he encontrado el método de la clase cgi adecuado.
 
  Cualquier pista que me puedan dar será más que bien recibida.

 Los datos que se envía por un formulario POST se encuentran en los
 headers del request. Dentro de tu método do_POST deberías poder
 acceder a self.headers (que es un objeto del tipo MessageClass) para
 ver los datos:

 http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.headers



 Ya había intentado esa vía. Sin embargo, si hago  print self.headers en
 do_POST(), esto es lo que obtengo:


 User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5
 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
 Host: www.myserver.net:1234
 Pragma: no-cache
 Accept: */*
 Content-Length: 4
 Content-Type: application/x-www-form-urlencoded
 Connection: Keep-Alive
 X-BlueCoat-Via: F7D3AB2CA1943FBA


 No veo el 'input' por ninguna parte.

Ok, parece que toda esa data la tiene en self.rfile, prueba con esto:

def do_POST(self):
l = int(self.headers['Content-Length'])
print self.rfile.read(l)

--
A menudo unas pocas horas de Prueba y error podrán ahorrarte minutos
de leer manuales.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] parsear los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

2012-11-06 Por tema Jose Caballero



 Ok, parece que toda esa data la tiene en self.rfile, prueba con esto:

 def do_POST(self):
 l = int(self.headers['Content-Length'])
 print self.rfile.read(l)



Funciona. Perfecto!
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/