Sha256: 2df81fbfb4e84fe9b0cbb4b334c27bcf83e33fa2da6e6eca0353f35e1e0c1690

Contents?: true

Size: 1.38 KB

Versions: 7

Compression:

Stored size: 1.38 KB

Contents

module Excon
  module Middleware
    # Hijack is an Excon middleware which parses response headers and then
    # yields the underlying TCP socket for raw TCP communication (used to
    # attach to STDIN of containers).
    class Hijack < Base
      def response_call(datum)
        if datum[:hijack_block]
          # Need to process the response headers here rather than in
          # Excon::Middleware::ResponseParser as the response parser will
          # block trying to read the body.
          socket = datum[:connection].send(:socket)

          # c.f. Excon::Response.parse
          until match = /^HTTP\/\d+\.\d+\s(\d{3})\s/.match(socket.readline); end
          status = match[1].to_i

          datum[:response] = {
            :body          => '',
            :headers       => Excon::Headers.new,
            :status        => status,
            :remote_ip     => socket.respond_to?(:remote_ip) &&
                              socket.remote_ip,
            :local_port    => socket.respond_to?(:local_port) &&
                              socket.local_port,
            :local_address => socket.respond_to?(:local_address) &&
                              socket.local_address
          }

          Excon::Response.parse_headers(socket, datum)
          datum[:hijack_block].call socket.instance_variable_get(:@socket)
        end

        @stack.response_call(datum)
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
docker-api-1.13.2 lib/excon/middlewares/hijack.rb
docker-api-1.13.1 lib/excon/middlewares/hijack.rb
docker-api-1.13.0 lib/excon/middlewares/hijack.rb
docker-api-1.12.0 lib/excon/middlewares/hijack.rb
docker-api-1.11.2 lib/excon/middlewares/hijack.rb
docker-api-1.11.1 lib/excon/middlewares/hijack.rb
docker-api-1.11.0 lib/excon/middlewares/hijack.rb