Skip to content

Instantly share code, notes, and snippets.

@leahneukirchen
Created December 5, 2008 16:04

Revisions

  1. leahneukirchen created this gist Dec 5, 2008.
    43 changes: 43 additions & 0 deletions forward.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    require 'net/http'
    require 'rack'

    # todo
    # - detect ssl
    # - keepalive?

    module Rack
    class Forwarder
    def initialize(host, port=80)
    @host, @port = host, port
    end

    def call(env)
    rackreq = Rack::Request.new(env)

    headers = Rack::Utils::HeaderHash.new
    env.each { |key, value|
    if key =~ /HTTP_(.*)/
    headers[$1] = value
    end
    }

    res = Net::HTTP.start(@host, @port) { |http|
    m = rackreq.request_method
    case m
    when "GET", "HEAD", "DELETE", "OPTIONS", "TRACE"
    req = Net::HTTP.const_get(m.capitalize).new(rackreq.fullpath, headers)
    when "PUT", "POST"
    req = Net::HTTP.const_get(m.capitalize).new(rackreq.fullpath, headers)
    req.body_stream = rackreq.body
    else
    raise "method not supported: #{method}"
    end

    http.request(req)
    }

    [res.code, Rack::Utils::HeaderHash.new(res.to_hash), [res.body]]
    end
    end
    end