Estoy intentando usar Ruby Sinatra para crear un proxy simple para una página web específica. Puedo hacerlo en C#, sólo parece que no puede trabajar fuera de Sinatra, el código C# es el siguiente:Creación de un único proxy de página con Ruby Sinatra
<%@ WebHandler Language="C#" Class="Map" %>
using System;
using System.Web;
using System.Net;
using System.IO;
public class Map : IHttpHandler {
static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[0x1000];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
output.Write(buffer, 0, read);
}
public void ProcessRequest(HttpContext context)
{
string gmapUri = string.Format("http://maps.google.com/maps/api/staticmap{0}", context.Request.Url.Query);
WebRequest request = WebRequest.Create(gmapUri);
using (WebResponse response = request.GetResponse())
{
context.Response.ContentType = response.ContentType;
Stream responseStream = response.GetResponseStream();
CopyStream(responseStream, context.Response.OutputStream);
}
}
public bool IsReusable {
get {
return false;
}
}
}
El código Ruby Sinatra He tratado es el siguiente:
require 'rubygems'
require 'sinatra'
get '/mapsproxy/staticmap' do
request.path_info = 'http://maps.google.com/maps/api/staticmap'
pass
end
Supongo que el Sinatra no funciona (obtenga un 404) ya que solo pasa la solicitud a páginas del mismo dominio. Cualquier hepatitis sería muy apreciada.
EDIT:
Con ayuda del hombre de la lata 's que he llegado a una solución sucinta agradable, que funciona bien para mí:
get '/proxy/path' do
URI.parse(<URI> + request.query_string.gsub("|", "%7C")).read
end
Gracias por toda la ayuda.
Saludos. Esto parece prometedor ... Solo estoy tratando de resolverlo ... –
Debería agregar un poco de manejo de excepciones, y probablemente quiera utilizar el módulo 'Timeout' para proporcionar un mejor control en caso de que también se solicite una solicitud largo. Ver http://stackoverflow.com/questions/4964044/using-open-uri-to-fetch-xml-and-the-best-practice-in-case-of-problems-with-a-remo/4966240#4966240 por ejemplo. –
Parece que funciona bien con respuestas basadas en texto, aunque las reformatea, pero no las de imagen. Creo que necesito transmitir de alguna manera la respuesta a la respuesta de Sinatra ... –