• Publicidad

Duda con módulo HTTP::Proxy

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Duda con módulo HTTP::Proxy

Notapor BigBear » 2011-06-15 11:27 @519

Ando queriendo saber si el módulo HTTP::Proxy me podría dar la posibilidad
de capturar el contenido de la web cargada para poder realizar una modificación para
posteriormente devolver ese resultado a la página. Sería como el funcionamiento del famoso
programa achilles.

El código que tengo es este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use HTTP::Proxy;
  2.  
  3. my $test = HTTP::Proxy->new(port=>8080);
  4. $test->host();
  5. $test->start();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


En la documentación no he encontrado lo que quería o, más bien, mi inglés no es muy bueno...

¿ Es posible realizar esto ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2011-06-15 13:41 @611

HTTP::Proxy realiza las siguientes funciones: con HTTP::Daemon acepta conexiones desde los clientes (los usuarios), y con LWP::UserAgent bajará la página; luego, ejecutará los filtros definidos por ti en esa página, y el resultado se devolverá al cliente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con módulo HTTP::Proxy

Notapor BigBear » 2011-06-15 14:02 @627

¿Pero no hay ningún filtro de este módulo para hacer lo que tengo pensando?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2011-06-15 14:28 @644

Los filtros debes programarles; y les agregas al módulo con la función push_filter(), como aparece en la sección FILTERS, en la documentación del módulo.

Hay otro módulo llamado HTTP::Proxy::BodyFilter::htmltext, que, en teoría, debería facilitar la creación de esos filtros, pero tiene poca documentación.

No sé si es esto lo que quieres hacer.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-10 20:39 @902

Perdón por revivir un tema viejo pero me había olvidado de este proyecto. Por eso no te respondí. Lo que quiero es que una vez el servidor proxy capture la información de la página es poder tenerla en una variable para modificarla y después de eso terminar de responder a la página marcada:

La información que necesito es algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: __utma=111872281.314525818.1360496478.1360496478.1360759913.2; __utmz=11
1872281.1360496478.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
Connection: keep-alive
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Aunque también serviría para modificar los valores de los formularios.

¿ Se podrá hacer lo que quiero ?


PD : Encontré este código en Ruby que hace lo quiero :

Sintáxis: [ Descargar ] [ Ocultar ]
Using ruby Syntax Highlighting
  1. #!/usr/bin/env ruby
  2. # A quick and dirty implementation of an HTTP proxy server in Ruby
  3. # because I did not want to install anything.
  4. #
  5. # Copyright (C) 2009 Torsten Becker <[email protected]>
  6.  
  7. require 'socket'
  8. require 'uri'
  9.  
  10.  
  11. class Proxy
  12. def run port
  13. begin
  14. # Start our server to handle connections (will raise things on errors)
  15. @socket = TCPServer.new port
  16. # Handle every request in another thread
  17. loop do
  18. s = @socket.accept
  19. Thread.new s, &method(:handle_request)
  20. end
  21. # CTRL-C
  22. rescue Interrupt
  23. puts 'Got Interrupt..'
  24. # Ensure that we release the socket on errors
  25. ensure
  26. if @socket
  27. @socket.close
  28. puts 'Socked closed..'
  29. end
  30. puts 'Quitting.'
  31. end
  32. end
  33. def handle_request to_client
  34. request_line = to_client.readline
  35. verb = request_line[/^\w+/]
  36. url = request_line[/^\w+\s+(\S+)/, 1]
  37. version = request_line[/HTTP\/(1\.\d)\s*$/, 1]
  38. uri = URI::parse url
  39. # Show what got requested
  40. puts((" %4s "%verb) + url)
  41. to_server = TCPSocket.new(uri.host, (uri.port.nil? ? 80 : uri.port))
  42. to_server.write("#{verb} #{uri.path}?#{uri.query} HTTP/#{version}\r\n")
  43. content_len = 0
  44. loop do
  45. line = to_client.readline
  46. if line =~ /^Content-Length:\s+(\d+)\s*$/
  47. content_len = $1.to_i
  48. end
  49. # Strip proxy headers
  50. if line =~ /^proxy/i
  51. next
  52. elsif line.strip.empty?
  53. to_server.write("Connection: close\r\n\r\n")
  54. if content_len >= 0
  55. to_server.write(to_client.read(content_len))
  56. end
  57. break
  58. else
  59. print line
  60. to_server.write(line)
  61. end
  62. end
  63. buff = ""
  64. loop do
  65. to_server.read(4048, buff)
  66. to_client.write(buff)
  67. break if buff.size < 4048
  68. end
  69. # Close the sockets
  70. to_client.close
  71. to_server.close
  72. end
  73. end
  74.  
  75.  
  76. # Get parameters and start the server
  77. if ARGV.empty?
  78. port = 8008
  79. elsif ARGV.size == 1
  80. port = ARGV[0].to_i
  81. else
  82. puts 'Usage: proxy.rb [port]'
  83. exit 1
  84. end
  85.  
  86. Proxy.new.run port
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-11 16:44 @739

Sí que se puede.

Aquí hay un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl -w
  2. #############################
  3. # proxy-adkiller
  4. # Mike Schilli, 2012
  5. #############################
  6. use strict;
  7. use HTTP::Proxy;
  8. use HTTP::Proxy::HeaderFilter::simple;
  9. use HTTP::Request::Common;
  10.  
  11. my $proxy = HTTP::Proxy->new(
  12.     host => "192.168.1.123",
  13.     port => 9999
  14. );
  15.  
  16. my $repl = "http://perlmeister.com/test/" . "sandy-beach.jpg";
  17.  
  18. $proxy->push_filter(
  19.     request => HTTP::Proxy::HeaderFilter::simple->new(
  20.         sub {
  21.             my ( $self, $headers, $req ) = @_;
  22.  
  23.             if ( $req->uri() =~ /eviladserver\.com/ ) {
  24.                 $_[2] = GET $repl;
  25.             }
  26.         }
  27.     )
  28. );
  29.  
  30. $proxy->start;
  31.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Este programa crea un proxy, escuchando en la IP 192.168.1.126, y en el puerto 9999. Los usuarios se conectan a ese proxy para salir a Internet. Si alguien pide algo del dominio eviladserver.com, la petición es cambiada por una petición a una imagen jpeg de una bonita playa de arena.

Ejemplo sacado del artículo "Manipulación de contenidos Web", en la Linux Magazine 88.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-13 16:22 @723

Tengo una duda porque no puedo mostrar por pantalla el resultado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl -w
  2. #############################
  3. # proxy-adkiller
  4. # Mike Schilli, 2012
  5. #############################
  6. use strict;
  7. use HTTP::Proxy;
  8. use HTTP::Proxy::HeaderFilter::simple;
  9. use HTTP::Proxy::BodyFilter::complete;
  10.  
  11. my $proxy = HTTP::Proxy->new( port => 8080 );
  12.  
  13. $proxy->push_filter(
  14.     request => HTTP::Proxy::HeaderFilter::simple->new(
  15.         sub {
  16.             my ( $self, $headers, $req ) = @_;
  17.  
  18.             print $_[2];
  19.             print $self;
  20.             print $headers;
  21.             print $req;
  22.  
  23.             }
  24.  
  25.     )
  26. );
  27.  
  28. $proxy->start;
  29.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Qué estoy haciendo mal ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-14 20:08 @880

Quizás no puedas sacar nada hacia la salida estándar porque se use para responder a las peticiones del cliente.

Prueba a grabar esos datos en un archivo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-15 18:10 @799

¡Qué desgracia! Voy a tener que hacer el proxy desde cero. En el camino tuve problemas con las expresiones regulares. Mira:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor = "[request] : GET http://localhost/shell.php?upload= HTTP/1.1 dsadsad";
  2.  
  3. #[ver] : GET
  4. #[url] : http://localhost/shell.php?upload=
  5. #[version] : 1.1
  6.  
  7. #verb = request_line[/^\w+/]
  8. #url = request_line[/^\w+\s+(\S+)/, 1]
  9. #version = request_line[/HTTP\/(1\.\d)\s*$/, 1]
  10.  
  11. if($valor=~/^\w+/) {
  12. print $1;
  13. }
  14.  
  15. if($valor=~/^\w+\s+(\S+)/) {
  16. print $2;
  17. }
  18.  
  19. if($valor=~/HTTP\/(1\.\d)\s*$/) {
  20. print $2;
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Qué estoy haciendo mal en las expresiones regulares ?

P.D.: normalmente las expresiones regulares que uso en Perl sirven en Ruby.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-15 20:06 @879

Las variables especiales $1, $2, $3, etc. guardan los valores capturados por los grupos de paréntesis que están dentro de las expresiones regulares, así que
  • en la primera exp. reg. quieres sacar el valor de $1 correspondiente al primer par de paréntesis dentro del patrón, pero no hay paréntesis
  • en las dos siguientes, quieres sacar el valor de $2, pero en el patrón solo hay un par de paréntesis de captura, así que deberías usar $1
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados