#!/usr/bin/env ruby # frozen_string_literal: true # Usage: script/proxy-server [-p PORT] [-u USER:PASSWORD] require 'webrick' require 'webrick/httpproxy' port = 4001 if (found = ARGV.index('-p')) port = ARGV[found + 1].to_i end if (found = ARGV.index('-u')) username, password = ARGV[found + 1].split(':', 2) end match_credentials = lambda { |credentials| got_username, got_password = credentials.to_s.unpack('m*')[0].split(':', 2) got_username == username && got_password == password } log_io = $stdout log_io.sync = true webrick_opts = { Port: port, Logger: WEBrick::Log.new(log_io), AccessLog: [[log_io, '[%{X-Faraday-Adapter}i] %m %U -> %s %b']], ProxyAuthProc: lambda { |req, res| if username type, credentials = req.header['proxy-authorization'] .first.to_s.split(/\s+/, 2) unless type == 'Basic' && match_credentials.call(credentials) res['proxy-authenticate'] = %(Basic realm="testing") raise WEBrick::HTTPStatus::ProxyAuthenticationRequired end end } } proxy = WEBrick::HTTPProxyServer.new(webrick_opts) trap(:TERM) { proxy.shutdown } trap(:INT) { proxy.shutdown } proxy.start