2009-07-13 4 views

ответ

4

Это похоже на работу при использовании сокетов:

require 'socket'     
host = "download.thinkbroadband.com"     
path = "/1GB.zip" # get 1gb sample file 
request = "GET #{path} HTTP/1.0\r\n\r\n" 
socket = TCPSocket.open(host,80) 
socket.print(request)   

# find beginning of response body 
buffer = ""      
while !buffer.match("\r\n\r\n") do 
    buffer += socket.read(1) 
end   

response = socket.read(100) #read first 100 bytes of body 
puts response 

Мне интересно, если есть «рубин путь».

+0

Привет Мишель, по какой-то причине, когда я пытаюсь файл, такие как 'HTTP:// www.forcefieldpr.com/asdyoucantbealone.mp3', который работает в браузере, я продолжаю получать 404 html-страницу. Будет ли это связано с запросом? –

+0

Я отправил исправление, исправляющее проблему @AaronMoodie. Некоторым веб-серверам нужен заголовок «Host», поэтому я добавил именно это: 'request =" GET # {path} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket

0

Отъезд "OpenURI returns two different objects". Возможно, вы сможете злоупотреблять методами там, чтобы прервать загрузку/выброс остальной части результата после заданного предела.

+0

Спасибо за интересный момент – taro

3

Это старая тема, но это все еще вопрос, который кажется главным образом без ответа в соответствии с моими исследованиями. Вот решение, которое я придумал по обезьяне-заплат Net :: HTTP НЕМНОГО:

require 'net/http' 

# provide access to the actual socket 
class Net::HTTPResponse 
    attr_reader :socket 
end 

uri = URI("http://www.example.com/path/to/file") 
begin 
    Net::HTTP.start(uri.host, uri.port) do |http| 
    request = Net::HTTP::Get.new(uri.request_uri) 
    # calling request with a block prevents body from being read 
    http.request(request) do |response| 
     # do whatever limited reading you want to do with the socket 
     x = response.socket.read(100); 
    end 
    end 
rescue IOError 
    # ignore 
end 

Спасательное улавливает IOError, который выдается при вызове HTTP.finish преждевременно.

FYI, сокет в HTTPResponse объект не является истинным IO объекта (это внутренний класс называется BufferedIO), но это довольно легко обезьяньего патч, который тоже, чтобы имитировать IO методы вам нужно. Например, одна библиотека, я использовал (exifr) необходима readchar метод, который легко добавить:

class Net::BufferedIO 
    def readchar 
    read(1)[0].ord 
    end 
end 
+0

Отлично! Вы можете получить доступ к сокету без исправления, просто используйте: 'response.instance_variable_get (: @ socket) .read (5120)' – inket

+0

Это решение застряло неограниченно с ruby-2.0.0p247 в OS X 10.9. Не удалось сузить проблему, но обратная сторона упоминает строку 155 в 'net/protocol.rb'. – inket

 Смежные вопросы

  • Нет связанных вопросов^_^