Ceci est un ancien fil de discussion, mais la question de savoir comment lire seulement une partie d'un fichier via HTTP dans Ruby est encore la plus souvent sans réponse selon mes recherches. Voici une solution je suis venu avec par singe-patcher Net :: HTTP un peu:
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);
# be sure to call finish before exiting the block
http.finish
end
end
rescue IOError
# ignore
end
Le sauvetage attrape le IOError qui est jeté lorsque vous appelez HTTP.finish prématurément.
Pour votre information, la prise dans l'objet HTTPResponse
est pas un vrai objet IO
(il est une classe interne appelée BufferedIO
), mais il est assez facile de singe patch qui, aussi, pour imiter les méthodes IO
dont vous avez besoin. Par exemple, une autre bibliothèque que j'utilisais (exifr) avait besoin de la méthode readchar
, qui était facile d'ajouter:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
ce n'est pas une réponse. C'est vous qui n'arrivez pas à imaginer comment quelque chose pourrait être nécessaire/utile/souhaitable parce que vous ne l'avez pas encore rencontré personnellement. Qui se soucie pourquoi il a besoin de? Qui se soucie si vous avez une fin de course autour de la question? La question est "Comment lire seulement x nombre d'octets du corps en utilisant Net :: HTTP? ". Savez-vous comment? Si non, pourquoi gaspillez-vous la bande passante de tout le monde? –