2009-07-13 24 views

Trả lời

4

Điều này dường như làm việc khi sử dụng ổ cắm:

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 

tôi tò mò nếu có một "cách ruby".

+0

Hi Michel, vì một lý do bất cứ khi nào tôi thử một tập tin như 'http:// www.forcefieldpr.com/asdyoucantbealone.mp3', hoạt động trong trình duyệt, tôi tiếp tục nhận được trang 404 html. Điều này có liên quan đến yêu cầu không? –

+0

Tôi đã gửi bản chỉnh sửa khắc phục sự cố @AaronMoodie. Một số máy chủ web cần tiêu đề "Máy chủ", vì vậy tôi đã thêm vào đó: 'request =" GET # {path} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket

0

Xem "OpenURI returns two different objects". Bạn có thể lạm dụng các phương pháp trong đó để làm gián đoạn việc tải xuống/vứt bỏ phần còn lại của kết quả sau một giới hạn đặt trước.

+0

Thanks for điểm thú vị – taro

3

Đây là một chủ đề cũ, nhưng nó vẫn là một câu hỏi mà dường như hầu như không được trả lời theo nghiên cứu của tôi. Đây là một giải pháp mà tôi đã đưa ra bằng cách vá lỗi của Net: HTTP một chút:

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 

Việc cứu bắt IOError bị ném khi bạn gọi HTTP.finish sớm.

FYI, các ổ cắm trong đối tượng HTTPResponse không phải là một đối tượng IO đúng (đó là một lớp học nội gọi BufferedIO), nhưng nó khá dễ dàng để khỉ vá mà cũng vậy, để bắt chước IO phương pháp mà bạn cần. Ví dụ, một thư viện tôi đã sử dụng (exifr) cần các readchar phương pháp, đó là dễ dàng để thêm:

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

Tuyệt vời! Bạn có thể truy cập ổ cắm mà không cần vá bằng cách này, chỉ cần sử dụng: 'response.instance_variable_get (: @ socket) .read (5120)' – inket

+0

Giải pháp này bị kẹt vô thời hạn với ruby-2.0.0p247 trong OS X 10.9. Không thể thu hẹp sự cố, nhưng backtrace đề cập đến dòng 155 trong 'net/protocol.rb'. – inket

Các vấn đề liên quan