faraday/script/proxy-server
2019-03-08 17:45:12 +00:00

46 lines
1.2 KiB
Ruby
Executable File

#!/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