Created
November 13, 2011 06:42
-
-
Save cherenkov/1361701 to your computer and use it in GitHub Desktop.
ヘッダ偽装。youkuなどの中国動画サイトをipadで見る方法はありますか?今ま.. - 人力検索はてな http://q.hatena.ne.jp/1321153126
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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