Sha256: 182af38cee04b1fbdadba3d6291047857c0bcaaa2ad3f3ea84f85f5eea8102bb

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

module ThreadedProxy
  class SocketResponder
    def initialize(socket)
      @socket = socket
    end

    def render(options = {})
      return false if @socket.closed?

      status  = options[:status] || 200
      headers = options[:headers] || {}
      body    = options[:body]
      json    = options[:json]
      text    = options[:text]

      if json
        body = json.to_json
        headers['Content-Type'] ||= 'application/json; charset=utf-8'
      elsif text
        body = text
        headers['Content-Type'] ||= 'text/plain; charset=utf-8'
      else
        body ||= ''
      end

      response = ActionDispatch::Response.new(status, headers, [])
      response.prepare!

      # Build the HTTP response
      response_str = "HTTP/1.1 #{response.status} #{response.message}\r\n"
      response.headers.each do |key, value|
        Array(value).each do |v|
          response_str += "#{key}: #{v}\r\n"
        end
      end
      response_str += "\r\n"

      write(response_str)

      if body.respond_to?(:read)
        IO.copy_stream(body, @socket)
      else
        write(body)
      end

      close
    end

    def redirect_to(url)
      render(status: 302, headers: { 'Location' => url })
    end

    def write(data)
      @socket.write(data) unless @socket.closed?
    end

    def close
      @socket.close unless @socket.closed?
    end

    def closed?
      @socket.closed?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rails-threaded-proxy-0.5.0 lib/threaded_proxy/socket_responder.rb