2010-03-10 4 views
5

में एक साधारण वेबसर्वर लिखना मैं रुबी में विकास उद्देश्यों के लिए एक बेहद सरल वेब सर्वर बनाना चाहता हूं (नहीं, तैयार समाधानों का उपयोग नहीं करना चाहता)।रूबी

यहाँ कोड है:

#!/usr/bin/ruby 

require 'socket' 

server = TCPServer.new('127.0.0.1', 8080) 

while connection = server.accept 
    headers = [] 
    length = 0 

    while line = connection.gets 
    headers << line 

    if line =~ /^Content-Length:\s+(\d+)/i 
     length = $1.to_i 
    end 

    break if line == "\r\n" 
    end 

    body = connection.readpartial(length) 

    IO.popen(ARGV[0], 'r+') do |script| 
    script.print(headers.join + body) 
    script.close_write 
    connection.print script.read 
    end 

    connection.close 
end 

विचार, कमांड लाइन से इस स्क्रिप्ट को चलाने के लिए एक और स्क्रिप्ट है, जो अपने मानक इनपुट पर अनुरोध प्राप्त होगा प्रदान कर रहा है, और पीठ पर पूरा प्रतिक्रिया देता है इसके मानक उत्पादन।

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

/usr/bin/serve:24:in `write': Broken pipe (Errno::EPIPE) 
    from /usr/bin/serve:24:in `print' 
    from /usr/bin/serve:24 
    from /usr/bin/serve:23:in `popen' 
    from /usr/bin/serve:23 

किसी भी विचार कितना आसान उपयोग के लिए पर्याप्त होना करने के लिए उपरोक्त कोड में सुधार करने के ?

संस्करण: उबंटू 9.10 (2.6.31-20-सामान्य), रूबी 1.8.7 (2009-06-12 Patchlevel 174) [i486-linux]

+0

जोओ, चूंकि आप और मुझे ऐसे अलग-अलग परिणाम मिल रहे हैं, शायद आपको अपने रूबी और ओएस संस्करणों में अपने प्रश्न में जोड़ना चाहिए। –

+0

मैंने संस्करण जोड़े हैं। –

उत्तर

4

समस्या, बच्चे लिपि में होना करने के लिए के बाद से अपने प्रश्न में माता-पिता स्क्रिप्ट मेरी बॉक्स (डेबियन निचोड़, रूबी 1.8.7 Patchlevel 249) पर चलता है प्रकट होता है:

मैं डमी बनाया बच्चे स्क्रिप्ट bar.rb:

#!/usr/bin/ruby1.8 

s = $stdin.read 
$stderr.puts s 
print s 

मैं तो स्क्रिप्ट चलाने, यह डमी पथ को स्क्रिप्ट पर गुजर:

$ /tmp/foo.rb /tmp/bar.rb 

The I wget के साथ मारा:

$ wget localhost:8080/index 

और डमी स्क्रिप्ट के उत्पादन देखा:

GET /index HTTP/1.0^M 
User-Agent: Wget/1.12 (linux-gnu)^M 
Accept: */*^M 
Host: localhost:8080^M 
Connection: Keep-Alive^M 
^M 

मैं यह भी देखा wget प्राप्त है कि यह क्या भेजा:

$ cat index 
GET /index HTTP/1.0 
User-Agent: Wget/1.12 (linux-gnu) 
Accept: */* 
Host: localhost:8080 
Connection: Keep-Alive 

यह काम किया इससे कोई फर्क नहीं पड़ता कि मैं इसे कितनी बार wget के साथ मारा।

+0

मैंने आपके बच्चे की स्क्रिप्ट की कोशिश की और इसे पहले रन के लिए एक त्रुटि फेंक दी। हो सकता है कि कुछ ओएस-स्तरीय अंतर यहां खेलें। –

+0

ठीक है, मैंने पाया कि समस्या कहां है। यह बाल लिपि में है: मैंने केवल मूल HTTP प्रतिक्रिया मुद्रित की है, जबकि आपने पहले stdin पढ़ा है। अब सवाल यह है कि ऐसा करने के लिए यह क्यों सक्षम है। –

1

रूबी Webrick लिब के साथ आप एक आसान लाइब्रेरी है एक वेबसर्वर बनाने के लिए।

http://www.ruby-doc.org/stdlib/libdoc/webrick/rdoc/

+0

धन्यवाद, लेकिन जैसा कि मैंने बताया है, मैं इसे स्वयं करूँगा। –

3

Ruby Web Servers Booklet अधिकांश वेब सर्वर कार्यान्वयन रणनीतियों का वर्णन करता है।