2011-02-11 14 views
7

का उपयोग कर एक एकल पेज प्रॉक्सी बनाना मैं एक विशिष्ट वेब पेज के लिए एक साधारण प्रॉक्सी बनाने के लिए रूबी सिनात्रा का उपयोग करने की कोशिश कर रहा हूं। मैं सी # में कर सकते हैं, मैं सिर्फ सिनात्रा के लिए इस पर काम नहीं कर पा रहे, सी # कोड के नीचे है:रूबी सिनात्रा

इस प्रकार
<%@ 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; 
    } 
} 

} 

रूबी सिनात्रा कोड मैं कोशिश की है है:

require 'rubygems' 
require 'sinatra' 

get '/mapsproxy/staticmap' do 
    request.path_info = 'http://maps.google.com/maps/api/staticmap' 
    pass 
end 

मुझे लगता है कि सिनात्रा कोई काम नहीं करता है (404 प्राप्त करें) क्योंकि केवल उसी डोमेन में पृष्ठों के अनुरोध को पास कर रहा है। किसी भी ढेर की सराहना की जाएगी।

संपादित करें:

टिन मनुष्य की मदद मैं एक अच्छा संक्षिप्त समाधान है, जो मेरे लिए अच्छी तरह से काम ले कर आए हैं के साथ:

get '/proxy/path' do 
    URI.parse(<URI> + request.query_string.gsub("|", "%7C")).read 
end 

सभी मदद के लिए धन्यवाद।

उत्तर

4

आप अपने सिनात्रा ऐप्लिकेशन URL प्राप्त करना चाहते हैं, तो आप किसी प्रकार की एक HTTP ग्राहक आग की आवश्यकता होगी:

get '/mapsproxy/staticmap' do 
    require 'open-uri' 
    open('http://maps.google.com/maps/api/staticmap').read 
end 

मुझे लगता है कि यह काम करेगा और के बारे में के रूप में कम से कम के रूप में आप प्राप्त कर सकते है ।

यदि आपको अधिक tweakability की आवश्यकता है तो आप HTTPClient का उपयोग कर सकते हैं।

इसके अलावा, मुझे लगता है कि रैक इसे कर सकता है। सिनात्रा रैक के शीर्ष पर बनाया गया है, लेकिन यह थोड़ी देर के बाद से मैंने उस स्तर पर खेला था।

मैं अभी भी

Open-URI डॉक्स से प्रतिक्रिया से contentType निकालने के लिए एक रास्ता खोजने की जरूरत है:

The opened file has several methods for meta information as follows since 
it is extended by OpenURI::Meta. 

open("http://www.ruby-lang.org/en") {|f| 
    f.each_line {|line| p line} 
    p f.base_uri   # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/> 
    p f.content_type  # "text/html" 
    p f.charset   # "iso-8859-1" 
    p f.content_encoding # [] 
    p f.last_modified # Thu Dec 05 02:45:02 UTC 2002 
} 

अपने प्रयोजनों के लिए कुछ इस तरह काम करना चाहिए:

content_type = '' 
body = open("http://www.ruby-lang.org/en") {|f| 
    content_type = f.content_type  # "text/html" 
    f.read 
} 

मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि रेटू ब्लॉक का आरएन मान body को सौंपा जाएगा। यदि यह काम नहीं करता है तो कोशिश करें:

content_type = '' 
body = '' 
open("http://www.ruby-lang.org/en") {|f| 
    content_type = f.content_type  # "text/html" 
    body = f.read 
} 

लेकिन मुझे लगता है कि पहला काम करेगा।

+0

चीयर्स। यह आशाजनक दिख रहा है ... मैं बस सामान की कोशिश कर रहा हूं ... –

+0

आपको कुछ अपवाद हैंडलिंग जोड़ने की आवश्यकता होगी, और शायद अनुरोध लेने पर बेहतर नियंत्रण प्रदान करने के लिए 'टाइमआउट' मॉड्यूल का उपयोग करना चाहेंगे लंबा। Http://stackoverflow.com/questions/4964044/using-open-uri-to-fetch-xml-and-the-best-practice-in-case-of-problems-with-a-remo/4966240#4966240 देखें उदाहरण के लिए। –

+0

यह पाठ आधारित प्रतिक्रियाओं के साथ ठीक काम करता प्रतीत होता है, हालांकि यह उन्हें दोबारा सुधारता है, लेकिन छवियों को नहीं। मुझे लगता है कि मुझे सिनात्रा प्रतिक्रिया के जवाब को किसी भी तरह से स्ट्रीम करने की जरूरत है ... –

1

की मदद से टिन मनुष्य और TK-421 मैं एक समाधान बाहर काम किया है नीचे सिनात्रा मार्ग देखते हैं,:,

get '/proxy/path' do 
    require 'open-uri' 
    uri = URI.parse(<URI>) 
    getresult = uri.read 
    halt 200, {'Content-Type' => getresult.content_type}, getresult 
end 

बस पृष्ठ की आवश्यकता के साथ <URI> की जगह और आप जाने के लिए अच्छे हैं।

के बाद कुछ और खेलने यह है कि मैं क्या लेकर आए हैं:

get '/proxy/path' do 
    URI.parse(<URI> + request.query_string.gsub("|", "%7C")).read 
end 

के रूप में किसी और का उल्लेख किया जहां कोड के शीर्ष पर require 'open-uri' की जरूरत है। gsub का कारण यह है कि किसी कारण से पार्स विफल रहता है यदि वे छोड़े जाते हैं, और मेरा ब्राउज़र स्वचालित रूप से उन्हें एन्कोड नहीं करता है।

+0

टिन मैन ने सही उत्तर प्रदान किया। यह काम करने के लिए अच्छा है। तो, क्या आपको रूबी को सी # से बेहतर पसंद है? ;) –

+0

आप वास्तव में 'रोकथाम 200, {' सामग्री-प्रकार '=> getresult.content_type}, getresult' के स्थान पर' वापसी getresult' का उपयोग कर सकते हैं, क्योंकि यूरी एक पूर्ण प्रतिक्रिया देता है, जहां तक ​​मैं कह सकता हूं। –

+0

मुझे सी # कभी पसंद नहीं आया है, केवल इसे काम के लिए उपयोग करें, मैं अपने कोडिंग (लिस्प, स्कीम, क्लोजर, जावास्क्रिप्ट) के लिए व्याख्या की गई भाषाओं को बहुत पसंद करता हूं। मैं रूबी के लिए काफी नया हूं, लेकिन वास्तव में इसका आनंद ले रहा हूं :) –

संबंधित मुद्दे