X-Git-Url: https://code.delx.au/cgiproxy/blobdiff_plain/c477945fe27a9bb86a5aa3ae6a1902abc5ebb495..0faded7b34470dde962855b9584453be238e656a:/ruby/proxy.rb diff --git a/ruby/proxy.rb b/ruby/proxy.rb index bef8602..7e3cf66 100644 --- a/ruby/proxy.rb +++ b/ruby/proxy.rb @@ -5,107 +5,107 @@ require 'net/https' require 'uri' class NilClass - # Make it easier to check for empty string or nil - def empty?; true; end - def to_s; ""; end + # Make it easier to check for empty string or nil + def empty?; true; end + def to_s; ""; end end def get_params(url) - if !ENV["PATH_INFO"].empty? - url += ENV["PATH_INFO"] - end + if !ENV["PATH_INFO"].empty? + url += ENV["PATH_INFO"] + end - url = URI.parse(url); - if !["http", "https"].include? url.scheme - raise RuntimeError, "Unsupported scheme: #{url.scheme}" - end + url = URI.parse(url); + if !["http", "https"].include? url.scheme + raise RuntimeError, "Unsupported scheme: #{url.scheme}" + end - use_ssl = url.scheme == 'https' + use_ssl = url.scheme == 'https' - filename = url.path.split("/")[-1] - path = url.path - if !ENV["QUERY_STRING"].empty? - path += "?" + ENV["QUERY_STRING"] - end + filename = url.path.split("/")[-1] + path = url.path + if !ENV["QUERY_STRING"].empty? + path += "?" + ENV["QUERY_STRING"] + end - return url.host, url.port, use_ssl, filename, path + return url.host, url.port, use_ssl, filename, path end def add_header(req, env_key, header_key) - value = ENV[env_key] - if !value.empty? - req[header_key] = value - end + value = ENV[env_key] + if !value.empty? + req[header_key] = value + end end def create_request(method, path, ff_header) - if method == "GET" - req = Net::HTTP::Get.new(path) - elsif method == "POST" - req = Net::HTTP::Post.new(path) - req.body = $stdin.read() - else - raise RuntimeError, "No support for method: #{method}" - end - - if ff_header - add_header(req, "REMOTE_ADDR", "X-Forwarded-For") - end - add_header(req, "HTTP_HOST", "Host") - add_header(req, "HTTP_COOKIE", "Cookie") - add_header(req, "HTTP_REFERER", "Referer") - add_header(req, "CONTENT_LENGTH", "Content-Length") - add_header(req, "CONTENT_TYPE", "Content-Type") - add_header(req, "HTTP_USER_AGENT", "User-Agent") - add_header(req, "HTTP_CACHE_CONTROL", "Cache-Control") - add_header(req, "HTTP_AUTHORIZATION", "Authorization") - add_header(req, "HTTP_ACCEPT", "Accept") - add_header(req, "HTTP_ACCEPT_CHARSET", "Accept-Charset") - add_header(req, "HTTP_ACCEPT_ENCODING", "Accept-Encoding") - add_header(req, "HTTP_ACCEPT_LANGUAGE", "Accept-Language") - - return req + if method == "GET" + req = Net::HTTP::Get.new(path) + elsif method == "POST" + req = Net::HTTP::Post.new(path) + req.body = $stdin.read() + else + raise RuntimeError, "No support for method: #{method}" + end + + if ff_header + add_header(req, "REMOTE_ADDR", "X-Forwarded-For") + end + add_header(req, "HTTP_HOST", "Host") + add_header(req, "HTTP_COOKIE", "Cookie") + add_header(req, "HTTP_REFERER", "Referer") + add_header(req, "CONTENT_LENGTH", "Content-Length") + add_header(req, "CONTENT_TYPE", "Content-Type") + add_header(req, "HTTP_USER_AGENT", "User-Agent") + add_header(req, "HTTP_CACHE_CONTROL", "Cache-Control") + add_header(req, "HTTP_AUTHORIZATION", "Authorization") + add_header(req, "HTTP_ACCEPT", "Accept") + add_header(req, "HTTP_ACCEPT_CHARSET", "Accept-Charset") + add_header(req, "HTTP_ACCEPT_ENCODING", "Accept-Encoding") + add_header(req, "HTTP_ACCEPT_LANGUAGE", "Accept-Language") + + return req end 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| - - if res.code != "200" - res["Status"] = "#{res.code} #{res.message}" - end - res.each_capitalized_name do |key| - res.get_fields(key).each do |value| - $stdout.write "#{key}: #{value}\r\n" - end - end - $stdout.write "\r\n" - - out = nil - if output_dir - out = File.open("#{output_dir}/#{filename}", 'w') - end - res.read_body do |chunk| - $stdout.write chunk - if out - out.write chunk - end - end - end + # Make the request + http = Net::HTTP.new(host, port) + http.use_ssl = use_ssl + res = http.request req do |res| + + if res.code != "200" + res["Status"] = "#{res.code} #{res.message}" + end + res.each_capitalized_name do |key| + res.get_fields(key).each do |value| + $stdout.write "#{key}: #{value}\r\n" + end + end + $stdout.write "\r\n" + + out = nil + if output_dir + out = File.open("#{output_dir}/#{filename}", 'w') + end + res.read_body do |chunk| + $stdout.write chunk + if out + out.write chunk + end + end + end end def debug(msg) - File.open("/tmp/debuglog.txt", "a") { |f| - f << Time.new.to_s + " " + msg + "\n" - } + File.open("/tmp/debuglog.txt", "a") { |f| + f << Time.new.to_s + " " + msg + "\n" + } end 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) + 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