Skip to content

Instantly share code, notes, and snippets.

@cherenkov
Created November 13, 2011 06:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cherenkov/1361701 to your computer and use it in GitHub Desktop.
Save cherenkov/1361701 to your computer and use it in GitHub Desktop.
ヘッダ偽装。youkuなどの中国動画サイトをipadで見る方法はありますか?今ま.. - 人力検索はてな http://q.hatena.ne.jp/1321153126
#!/usr/bin/env ruby
require 'webrick'
require 'webrick/httpproxy'
require 'optparse'
include WEBrick
#WEBrick::HTTPProxyServer で無理矢理リクエストヘッダを書き換えるプロクシサーバ - PARAGRAPHS
#http://d.hatena.ne.jp/tily/20090511/p1
#
#使い方:ruby my_proxy.rb -r "X-Forwarded-For:58.30.0.0"
# HTTPリクエストヘッダを付加したい - kkkkkkkk <http://d.hatena.ne.jp/kkkkkkkk/20060707/p1>
class MyProxyServer < HTTPProxyServer
def run(sock)
while true
res = HTTPResponse.new(@config)
req = HTTPRequest.new(@config)
def req.read_header(socket)
super
begin
@header = HTTPUtils::parse_header(@raw_header)
@config[:RequestHeaders].each do |k,v|
@header[k] = [v]
end
rescue => ex
raise HTTPStatus::BadRequest, ex.message
end
end
server = self
begin
timeout = @config[:RequestTimeout]
while timeout > 0
break if IO.select([sock], nil, nil, 0.5)
timeout = 0 if @status != :Running
timeout -= 0.5
end
raise HTTPStatus::EOFError if timeout <= 0 || sock.eof?
req.parse(sock)
res.request_method = req.request_method
res.request_uri = req.request_uri
res.request_http_version = req.http_version
res.keep_alive = req.keep_alive?
server = lookup_server(req) || self
if callback = server[:RequestCallback] || server[:RequestHandler]
callback.call(req, res)
end
server.service(req, res)
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
res.set_error(ex)
rescue HTTPStatus::Error => ex
@logger.error(ex.message)
res.set_error(ex)
rescue HTTPStatus::Status => ex
res.status = ex.code
rescue StandardError => ex
@logger.error(ex)
res.set_error(ex, true)
ensure
if req.request_line
req.fixup()
res.send_response(sock)
server.access_log(@config, req, res)
end
end
break if @http_version < "1.1"
break unless req.keep_alive?
break unless res.keep_alive?
end
end
end
# default settings
header_list = []
address = 'localhost'
port = 8080
# option parse
opt = OptionParser.new
opt.on('-r HEADERS', Array ) {|v| header_list = v }
opt.on('-b ADDRESS', String ) {|v| address = v }
opt.on('-p PORT', Integer) {|v| port = v }
opt.parse!
# create request headers
request_headers = {}
header_list.each do |header|
field, value = header.split(':')
request_headers[field] = value
end
# construct proxy server
server = MyProxyServer.new(
:BindAddress => address,
:Port => port,
:Logger => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),
:ProxyVia => false,
:RequestHeaders => request_headers
)
# start server
Signal.trap('INT') { server.shutdown; }
server.start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment