]> code.delx.au - cgiproxy/blobdiff - ruby/proxy.rb
Support for https
[cgiproxy] / ruby / proxy.rb
index f03091d1d9d0dcca12ba8b2bab4b98cad770f15a..10002f1ff9cb2f1532e1d5ae7644dc767d293d30 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 
 require 'net/http'
+require 'net/https'
 require 'uri'
 
 class NilClass
@@ -10,25 +11,27 @@ class NilClass
 end
 
 
-def createUrl(url)
+def getParams(url)
        if !ENV["PATH_INFO"].empty?
                url += ENV["PATH_INFO"]
        end
-       if !ENV["QUERY_STRING"].empty?
-               url += "?" + ENV["QUERY_STRING"]
-       end
+
        url = URI.parse(url);
-       if url.scheme != "http"
+       if !["http", "https"].include? url.scheme
                raise RuntimeError, "Unsupported scheme: #{url.scheme}"
        end
-       return url
-end
 
-def createRequest(method, url)
+       use_ssl = url.scheme == 'https'
+
        path = url.path
-       if !url.query.empty?
-               path += "?" + url.query
+       if !ENV["QUERY_STRING"].empty?
+               path += "?" + ENV["QUERY_STRING"]
        end
+
+       return url.host, url.port, use_ssl, path
+end
+
+def createRequest(method, path)
        if method == "GET"
                req = Net::HTTP::Get.new(path)
        elsif method == "POST"
@@ -40,8 +43,10 @@ def createRequest(method, url)
        return req
 end
 
-def insertHeaders(req)
-       req["X-Forwarded-For"] = ENV["REMOTE_ADDR"]
+def insertHeaders(req, ffHeader)
+       if ffHeader
+               req["X-Forwarded-For"] = ENV["REMOTE_ADDR"]
+       end
        req["Host"] = ENV["HTTP_HOST"]
        req["Cookie"] = ENV["HTTP_COOKIE"]
        req["Referer"] = ENV["HTTP_REFERER"]
@@ -56,11 +61,11 @@ def insertHeaders(req)
        req["Accept-Language"] = ENV["HTTP_ACCEPT_LANGUAGE"]
 end
 
-def doRequest(req, host, port)
+def doRequest(req, host, port, use_ssl)
        # Make the request
-       res = Net::HTTP.start(host, port) do |http|
-               http.request(req)
-       end
+       http = Net::HTTP.new(host, port)
+       http.use_ssl = use_ssl
+       res = http.request(req)
 
        # Tweak the headers a little
        res.delete("transfer-encoding")
@@ -71,8 +76,13 @@ def doRequest(req, host, port)
 end
 
 def printResult(res)
-       res.each_capitalized do |key, value|
-               print "#{key}: #{value}\r\n"
+       if res.code != "200"
+               res["Status"] = "#{res.code} #{res.message}"
+       end
+       res.each_capitalized_name do |key|
+               res.get_fields(key).each do |value|
+                       print "#{key}: #{value}\r\n"
+               end
        end
        print "\r\n"
        print res.body
@@ -84,11 +94,11 @@ def debug(msg)
        }
 end
 
-def proxyTo(basePath)
-       url = createUrl(basePath)
-       req = createRequest(ENV["REQUEST_METHOD"], url)
-       insertHeaders(req)
-       res = doRequest(req, url.host, url.port)
+def proxyTo(basePath, ffHeader=True)
+       host, port, use_ssl, path = getParams(basePath)
+       req = createRequest(ENV["REQUEST_METHOD"], path)
+       insertHeaders(req, ffHeader)
+       res = doRequest(req, host, port, use_ssl)
        printResult(res)
 end