Sha256: 7a45c2504a1720f5a8582e1c082b789fd82154686e6a599a4becc5417665d911

Contents?: true

Size: 1.79 KB

Versions: 3

Compression:

Stored size: 1.79 KB

Contents

module Faye

  class Transport::Http < Transport
    def self.usable?(client, endpoint, &callback)
      callback.call(URI === endpoint)
    end

    def encode(envelopes)
      Faye.to_json(envelopes.map { |e| e.message })
    end

    def request(envelopes)
      content = encode(envelopes)
      params  = build_params(@endpoint, content)
      request = create_request(params)

      request.callback do
        handle_response(request.response, envelopes)
        store_cookies(request.response_header['SET_COOKIE'])
      end

      request.errback do
        handle_error(envelopes)
      end
    end

  private

    def build_params(uri, content)
      {
        :head => {
          'Content-Length'  => content.bytesize,
          'Content-Type'    => 'application/json',
          'Cookie'          => get_cookies,
          'Host'            => uri.host
        }.merge(@client.headers),

        :body    => content,
        :timeout => -1  # for em-http-request < 1.0
      }
    end

    def create_request(params)
      version = EventMachine::HttpRequest::VERSION.split('.')[0].to_i
      client  = if version >= 1
                  options = {                 # for em-http-request >= 1.0
                    :inactivity_timeout => 0  # connection inactivity (post-setup) timeout (0 = disable timeout)
                  }
                  EventMachine::HttpRequest.new(@endpoint.to_s, options)
                else
                  EventMachine::HttpRequest.new(@endpoint.to_s)
                end

      client.post(params)
    end

    def handle_response(response, envelopes)
      message = MultiJson.load(response) rescue nil
      if message
        receive(envelopes, message)
      else
        handle_error(envelopes)
      end
    end
  end

  Transport.register 'long-polling', Transport::Http

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
faye-1.0.4 lib/faye/transport/http.rb
faye-1.0.3 lib/faye/transport/http.rb
faye-1.0.1 lib/faye/transport/http.rb