Как мне HTTP отправлять потоковые данные из памяти в Ruby? - PullRequest
6 голосов
/ 17 мая 2011

Я хотел бы загрузить данные, сгенерированные мной во время выполнения в Ruby, что-то вроде подачи загрузки из блока.

Все примеры, которые я нашел, показывают только, как передать файл, который должен быть на диске до запроса, но я не хочу буферизовать файл.

Какое лучшее решение, кроме подключения собственного сокета?

Это пример псевдокода:

post_stream('127.0.0.1', '/stream/') do |body|
  generate_xml do |segment|
    body << segment
  end
end

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Код, который работает.

    require 'thread'
    require 'net/http'
    require 'base64'
    require 'openssl'

    class Producer
      def initialize
       @mutex = Mutex.new
       @body = ''
       @eof = false
      end

      def eof!()
        @eof = true
      end

      def eof?()
        @eof
      end

      def read(size)
        @mutex.synchronize {
          @body.slice!(0,size)
        }
      end

      def produce(str)
        if @body.empty? && @eof
          nil
        else
          @mutex.synchronize { @body.slice!(0,size) }
        end
      end
    end

    data = "--60079\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.file\"\r\nContent-Type: application/x-ruby\r\n\r\nthis is just a test\r\n--60079--\r\n"

    req = Net::HTTP::Post.new('/')
    producer = Producer.new
    req.body_stream = producer
    req.content_length = data.length
    req.content_type = "multipart/form-data; boundary=60079"

    t1 = Thread.new do
      producer.produce(data)
      producer.eof!
    end

    res = Net::HTTP.new('127.0.0.1', 9000).start {|http| http.request(req) }
    puts res
1 голос
/ 17 мая 2011

Есть Net :: HTTPGenericRequest # body_stream = (obj.should response_to? (: Read))

Вы используете его более или менее так:

...