1
1
require 'pp'
2
2
require "net/https"
3
3
4
- class GithubForwarder
5
- def initialize ( app )
6
- @app = app
7
- end
8
-
9
- def call ( env )
10
- puts
11
- path = env [ "REQUEST_PATH" ]
12
- query_string = env [ "QUERY_STRING" ]
13
- puts "from: #{ env [ "REQUEST_URI" ] } "
14
- if path =~ /\/ github/ or query_string =~ /server=http:\/ \/ github/
15
- if path =~ /\/ github\/ /
16
- new_uri = "https://github.com" + path . gsub ( "/github" , "" ) + "?" + query_string
17
- else
18
- params = { }
19
- query_string . split ( "&" ) . each do |pair_string |
20
- pair = pair_string . split ( "=" )
21
- params [ pair [ 0 ] ] = pair [ 1 ] ? URI . decode ( pair [ 1 ] ) : ""
22
- end
23
- username = params . delete ( "username" )
24
- password = params . delete ( "password" )
25
- server = params . delete ( "server" )
26
-
27
- new_uri = "#{ server } #{ path } "
28
- params . each do |key , value |
29
- new_uri += "?" unless new_uri =~ /(\? |&)$/
30
- new_uri += key + "=" + URI . encode ( value )
31
- end
32
- end
33
- req = Rack ::Request . new ( env )
34
- method = req . request_method . downcase
35
- method [ 0 ..0 ] = method [ 0 ..0 ] . upcase
36
-
37
- puts "forwarding to: #{ new_uri } "
38
- new_uri = URI . parse ( new_uri )
39
-
40
- sub_request = Net ::HTTP . const_get ( method ) . new ( "#{ new_uri . path } #{ "?" if new_uri . query } #{ new_uri . query } " )
41
- if sub_request . request_body_permitted? and req . body
42
- body = req . body . read
43
- sub_request . body = body
44
- puts "body : #{ body . inspect } "
45
- sub_request . content_length = req . content_length
46
- sub_request . content_type = req . content_type
47
- if ( req . content_type ) . include? ( "application/x-git-upload-pack-request" )
48
- sub_request . content_type = "application/x-git-upload-pack-request"
49
- end
50
- end
51
-
52
- sub_request [ "X-Forwarded-For" ] = ( req . env [ "X-Forwarded-For" ] . to_s . split ( /, +/ ) + [ req . env [ 'REMOTE_ADDR' ] ] ) . join ( ", " )
53
- sub_request [ "Accept-Encoding" ] = req . accept_encoding
54
- sub_request [ "Referer" ] = req . referer
55
- session = Net ::HTTP . new ( new_uri . host , new_uri . port )
56
- if new_uri . scheme == "https"
57
- session . use_ssl = true
58
- end
59
- # sub_request.basic_auth(username, password)
60
- sub_response = session . start do |http |
61
- http . request ( sub_request )
62
- end
63
-
64
- headers = { }
65
- sub_response . each_header do |k , v |
66
- headers [ k ] = v unless k . to_s =~ /cookie|content-length|transfer-encoding/i
67
- end
68
- body = sub_response . read_body
69
- p body [ 0 ..200 ]
70
- File . open ( "response_body.bin" , "w" ) { |fout | fout . print body }
71
- puts "done"
72
- [ sub_response . code . to_i , headers , [ body ] ]
73
- else
74
- @app . call ( env )
75
- end
76
- end
77
- end
78
-
79
- use GithubForwarder
4
+ # class GithubForwarder
5
+ # def initialize(app)
6
+ # @app = app
7
+ # end
8
+ #
9
+ # def call(env)
10
+ # puts
11
+ # path = env["REQUEST_PATH"]
12
+ # query_string = env["QUERY_STRING"]
13
+ # puts "from: #{env["REQUEST_URI"]}"
14
+ # if path =~ /\/github/ or query_string =~ /server=http:\/\/github/
15
+ # if path =~ /\/github\//
16
+ # new_uri = "https://github.com" + path.gsub("/github", "") + "?" + query_string
17
+ # else
18
+ # params = {}
19
+ # query_string.split("&").each do |pair_string|
20
+ # pair = pair_string.split("=")
21
+ # params[pair[0]] = pair[1] ? URI.decode(pair[1]) : ""
22
+ # end
23
+ # username = params.delete("username")
24
+ # password = params.delete("password")
25
+ # server = params.delete("server")
26
+ #
27
+ # new_uri = "#{server}#{path}"
28
+ # params.each do |key, value|
29
+ # new_uri += "?" unless new_uri =~ /(\?|&)$/
30
+ # new_uri += key + "=" + URI.encode(value)
31
+ # end
32
+ # end
33
+ # req = Rack::Request.new(env)
34
+ # method = req.request_method.downcase
35
+ # method[0..0] = method[0..0].upcase
36
+ #
37
+ # puts "forwarding to: #{new_uri}"
38
+ # new_uri = URI.parse(new_uri)
39
+ #
40
+ # sub_request = Net::HTTP.const_get(method).new("#{new_uri.path}#{"?" if new_uri.query}#{new_uri.query}")
41
+ # if sub_request.request_body_permitted? and req.body
42
+ # body = req.body.read
43
+ # sub_request.body = body
44
+ # puts "body : #{body.inspect}"
45
+ # sub_request.content_length = req.content_length
46
+ # sub_request.content_type = req.content_type
47
+ # if (req.content_type).include?("application/x-git-upload-pack-request")
48
+ # sub_request.content_type = "application/x-git-upload-pack-request"
49
+ # end
50
+ # end
51
+ #
52
+ # sub_request["X-Forwarded-For"] = (req.env["X-Forwarded-For"].to_s.split(/, +/) + [req.env['REMOTE_ADDR']]).join(", ")
53
+ # sub_request["Accept-Encoding"] = req.accept_encoding
54
+ # sub_request["Referer"] = req.referer
55
+ # session = Net::HTTP.new(new_uri.host, new_uri.port)
56
+ # if new_uri.scheme == "https"
57
+ # session.use_ssl = true
58
+ # end
59
+ # # sub_request.basic_auth(username, password)
60
+ # sub_response = session.start do |http|
61
+ # http.request(sub_request)
62
+ # end
63
+ #
64
+ # headers = {}
65
+ # sub_response.each_header do |k,v|
66
+ # headers[k] = v unless k.to_s =~ /cookie|content-length|transfer-encoding/i
67
+ # end
68
+ # body = sub_response.read_body
69
+ # p body[0..200]
70
+ # File.open("response_body.bin", "w") {|fout| fout.print body}
71
+ # puts "done"
72
+ # [sub_response.code.to_i, headers, [body]]
73
+ # else
74
+ # @app.call(env)
75
+ # end
76
+ # end
77
+ # end
78
+ #
79
+ # use GithubForwarder
80
80
81
81
def concat_js
82
82
load_file = File . read ( File . dirname ( __FILE__ ) + "/../lib/jsgit-client.js" )
@@ -87,27 +87,28 @@ def concat_js
87
87
end
88
88
total_js = js . join ( "\n \n " )
89
89
File . open ( "../lib/git.js" , "w" ) { |f | f . puts total_js }
90
- [ 200 , { "Content-Type" => "text/javascript" } , total_js ]
90
+ [ 200 , { "Content-Type" => "text/javascript" } , [ total_js ] ]
91
91
end
92
92
93
93
run proc { |env |
94
- if env [ "REQUEST_URI" ] == "/favicon.ico"
95
- return [ 404 , { } , "" ]
96
- end
97
- if env [ "REQUEST_URI" ] == "/git.js"
98
- return concat_js
99
- end
100
- ext = env [ "REQUEST_URI" ] . split ( "." ) . last
101
- case ext
102
- when "js"
103
- content_type = "text/javascript"
104
- when "css"
105
- content_type = "text/css"
94
+ if env [ "PATH_INFO" ] == "/favicon.ico"
95
+ [ 404 , { "Content-Type" => "image/png" } , "" ]
96
+ elsif env [ "PATH_INFO" ] == "/git.js"
97
+ concat_js
106
98
else
107
- content_type = "text/html"
99
+ ext = env [ "PATH_INFO" ] . split ( "." ) . last
100
+ p ext
101
+ case ext
102
+ when "js"
103
+ content_type = "text/javascript"
104
+ when "css"
105
+ content_type = "text/css"
106
+ else
107
+ content_type = "text/html"
108
+ end
109
+ p env [ "REQUEST_PATH" ]
110
+ [ 200 , { "Content-Type" => content_type } , [ File . read ( File . dirname ( __FILE__ ) + "/../" + env [ "PATH_INFO" ] ) ] ]
108
111
end
109
-
110
- [ 200 , { "Content-Type" => content_type } , [ File . read ( File . dirname ( __FILE__ ) + "/../" + env [ "REQUEST_URI" ] ) ] ]
111
112
}
112
113
113
114
0 commit comments