43 lines
1.1 KiB
Ruby
Executable File
43 lines
1.1 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# 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 "Basic" == type && 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
|