X-Git-Url: https://code.delx.au/cgiproxy/blobdiff_plain/a5186af9c8968fe91479770e9cb06d312952958c..40070216e54515585ee0a6b6ab6675cee49083d2:/ruby/proxy.rb diff --git a/ruby/proxy.rb b/ruby/proxy.rb old mode 100755 new mode 100644 index 4eb744b..9563f88 --- a/ruby/proxy.rb +++ b/ruby/proxy.rb @@ -1,6 +1,7 @@ #!/usr/bin/env ruby require 'net/http' +require 'net/https' require 'uri' class NilClass @@ -10,25 +11,28 @@ class NilClass end -def getParams(url) +def get_params(url) if !ENV["PATH_INFO"].empty? url += ENV["PATH_INFO"] end url = URI.parse(url); - if url.scheme != "http" + if !["http", "https"].include? url.scheme raise RuntimeError, "Unsupported scheme: #{url.scheme}" end + use_ssl = url.scheme == 'https' + + filename = url.path.split("/")[-1] path = url.path if !ENV["QUERY_STRING"].empty? path += "?" + ENV["QUERY_STRING"] end - return url.host, url.port, path + return url.host, url.port, use_ssl, filename, path end -def createRequest(method, path) +def create_request(method, path, ff_header) if method == "GET" req = Net::HTTP::Get.new(path) elsif method == "POST" @@ -37,11 +41,10 @@ def createRequest(method, path) else raise RuntimeError, "No support for method: #{method}" end - return req -end -def insertHeaders(req) - req["X-Forwarded-For"] = ENV["REMOTE_ADDR"] + if ff_header + req["X-Forwarded-For"] = ENV["REMOTE_ADDR"] + end req["Host"] = ENV["HTTP_HOST"] req["Cookie"] = ENV["HTTP_COOKIE"] req["Referer"] = ENV["HTTP_REFERER"] @@ -54,28 +57,42 @@ def insertHeaders(req) req["Accept-Charset"] = ENV["HTTP_ACCEPT_CHARSET"] req["Accept-Encoding"] = ENV["HTTP_ACCEPT_ENCODING"] req["Accept-Language"] = ENV["HTTP_ACCEPT_LANGUAGE"] -end -def doRequest(req, host, port) - # Make the request - res = Net::HTTP.start(host, port) do |http| - http.request(req) - end - - # Tweak the headers a little - res.delete("transfer-encoding") - res.delete("transfer-length") - res["connection"] = "close" - - return res + return req end -def printResult(res) - res.each_capitalized do |key, value| - print "#{key}: #{value}\r\n" +def do_proxy(req, host, port, use_ssl, filename, output_dir) + # Make the request + http = Net::HTTP.new(host, port) + http.use_ssl = use_ssl + res = http.request req do |res| + + # Tweak the headers a little + res.delete("transfer-encoding") + res.delete("transfer-length") + res["connection"] = "close" + + 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" + + out = nil + if output_dir + out = File.open("#{output_dir}/#{filename}", 'w') + end + res.read_body do |chunk| + print chunk + if out + out.write chunk + end + end end - print "\r\n" - print res.body end def debug(msg) @@ -84,11 +101,9 @@ def debug(msg) } end -def proxyTo(basePath) - host, port, path = getParams(basePath) - req = createRequest(ENV["REQUEST_METHOD"], path) - insertHeaders(req) - res = doRequest(req, host, port) - printResult(res) +def proxy_to(base_path, ff_header=True, output_dir=nil) + host, port, use_ssl, filename, path = get_params(base_path) + req = create_request(ENV["REQUEST_METHOD"], path, ff_header) + do_proxy(req, host, port, use_ssl, filename, output_dir) end