Enviar un POST de Ruby Net::HTTP a través de un proxy
Configure una conexión HTTP de Ruby con un proxy explícito y luego envíe los datos del formulario al destino.
Mantenga el destino del formulario en la solicitud y el proxy en la configuración de la conexión. Un proxy no necesita un campo de formulario especial con la URL que desea, salvo que utilice la interfaz de proxy web de un sitio concreto.
Para Net::HTTP de Ruby, se puede proporcionar un proxy HTTP explícito al crear el cliente:
require 'net/http'
uri = URI('https://example.com/form')
http = Net::HTTP.new(uri.hostname, uri.port,
'203.0.113.10', 8080)
http.use_ssl = true
http.open_timeout = 5
http.read_timeout = 10
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data('message' => 'hello')
response = http.start { |session| session.request(request) }
El proxy es ilustrativo; los candidatos HTTP para pruebas de formularios públicos permitidas están disponibles en la lista de proxies HTTP. El punto de conexión del formulario debe sustituirse por un servicio destinado a aceptar el envío. La documentación del proxy de Net::HTTP también describe las credenciales del proxy y los ajustes derivados del entorno.
Lea la respuesta antes de culpar al proxy
Un servidor que rechaza un formulario puede producir un error HTTP después de que la ruta del proxy haya funcionado correctamente. Compruebe el estado de la respuesta y los requisitos del destino: método, tipo de contenido, campos del formulario, cookies y cualquier token de solicitud.
Un desafío de autenticación del proxy proviene del proxy. El inicio de sesión de la aplicación o un formulario rechazado pertenecen al destino. Mantenga sus credenciales separadas. Añadir la contraseña del destino a la configuración del proxy no puede satisfacer el inicio de sesión del destino.
Las reglas de encabezados de reenvío de Squid son otra posible fuente de confusión. Su política del lado del servidor es independiente de construir un POST válido de Ruby. No modifique las reglas de encabezados de un proxy compartido solo porque el formulario falló una vez.
Para los reintentos, considere si el primer envío ya pudo haberse procesado. Una respuesta perdida no demuestra que un POST nunca llegara a la aplicación.