cocproxy 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/bin/cocproxy +190 -0
  3. metadata +46 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 22de903f2dc0427e89597b9d4a1dc8dcca415320
4
+ data.tar.gz: 85707fe5dafebe581262f34a5853bc83d1756cdd
5
+ SHA512:
6
+ metadata.gz: 711f1c7a1726e41d74914ba8117900e59a969d3a1a72239adba821b0389d4e3c923ae64e94533ffb4b92b8f7adf9cbbd9ab025c8f86fbdc68369ec83b0e42b03
7
+ data.tar.gz: ffaff8eb1747b445ffc726c75e7cd78cd9b8ab7cac544c035fd7f7bce2f3bba7378590cf965fbc570aa273d299951370f8c09d407f29e3f5bf631652499dc238
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'webrick'
4
+ require 'webrick/httpproxy'
5
+ require 'uri'
6
+ require 'yaml'
7
+ require "pp"
8
+ require "pathname"
9
+ require "stringio"
10
+ require "zlib"
11
+ require "optparse"
12
+
13
+ class CocProxyCommand
14
+ VERSION = "$Revision$"
15
+ DEFAULT_CONFIG = {
16
+ :Port => 5432,
17
+ :ProxyVia => false,
18
+ :Logger => WEBrick::Log.new(nil, 0),
19
+ :AccessLog => WEBrick::Log.new(nil, 0),
20
+ :FilterDir => "files",
21
+ :Rules => [
22
+ "\#{File.basename(req.path_info)}",
23
+ "\#{req.host}\#{req.path_info}",
24
+ "\#{req.host}/\#{File.basename(req.path_info)}",
25
+ ".\#{req.path_info}",
26
+ ]
27
+ }
28
+
29
+ def self.run(argv)
30
+ new(argv.dup).run
31
+ end
32
+
33
+ def initialize(argv)
34
+ @argv = argv
35
+ @parser = OptionParser.new do |parser|
36
+ parser.banner = <<-EOB.gsub(/^\t+/, "")
37
+ Usage: #$0 [options]
38
+ EOB
39
+
40
+ parser.separator ""
41
+ parser.separator "Options:"
42
+
43
+ parser.on("-c", "--config CONFIG.yaml") do |config|
44
+ begin
45
+ @config = YAML.load_file(config)
46
+ rescue Errno::ENOENT
47
+ puts "#{config} is not found"
48
+ exit
49
+ end
50
+ end
51
+
52
+ parser.on("-p", "--port PORT", "Specify port number. This option overrides any config.") do |port|
53
+ @port = port.to_i
54
+ end
55
+
56
+ parser.on("-n", "--no-cache", "Disable cache.") do |port|
57
+ @nocache = true
58
+ end
59
+
60
+ parser.on("--disable-double-screen", "Disable loading double_screen.rb") do |c|
61
+ @disable_double_screen = c
62
+ end
63
+
64
+ parser.on("--version", "Show version string `#{VERSION}'") do
65
+ puts VERSION
66
+ exit
67
+ end
68
+ end
69
+ end
70
+
71
+ def run
72
+ @parser.order!(@argv)
73
+ $stdout.sync = true
74
+
75
+ unless @config
76
+ begin
77
+ @config = YAML.load_file("proxy-config.yaml")
78
+ puts "proxy-config.yaml was found. Use it."
79
+ rescue Errno::ENOENT
80
+ @config = {
81
+ "server" => {
82
+ },
83
+ }
84
+ puts "Use default configuration."
85
+ end
86
+ end
87
+
88
+ server_config = DEFAULT_CONFIG.update(@config["server"])
89
+ server_config[:Port] = @port if @port
90
+ server_config[:nocache] = @nocache
91
+ server_config[:ProxyURI] = URI.parse(server_config[:ProxyURI]) if server_config[:ProxyURI]
92
+
93
+ unless @disable_double_screen
94
+ begin
95
+ require "double_screen.rb"
96
+ rescue LoadError => e
97
+ end
98
+ end
99
+ puts "Port : #{server_config[:Port]}"
100
+ puts "Dir : #{server_config[:FilterDir]}/"
101
+ puts "Cache: #{!server_config[:nocache]}"
102
+ puts "Rules:"
103
+ server_config[:Rules].each_with_index do |item, index|
104
+ puts " #{index+1}. #{item}"
105
+ end
106
+
107
+ srv = ArrogationProxyServer.new(server_config)
108
+ trap(:INT) { srv.shutdown }
109
+ srv.start
110
+ end
111
+
112
+ class ArrogationProxyServer < WEBrick::HTTPProxyServer
113
+ def proxy_service(req, res)
114
+
115
+ referer = req.header["referer"]
116
+ dir = @config[:FilterDir]
117
+ $stderr.puts req.path_info if $DEBUG
118
+ $stderr.puts req.query.inspect if $DEBUG
119
+
120
+ content = ""
121
+ local_path = ""
122
+
123
+ @config[:Rules].each do |path|
124
+ path = "#{dir}/#{eval("%Q(#{path})")}"
125
+ $stderr.puts "Checking #{path.to_s}"
126
+ if FileTest.file? path
127
+ puts "Hit Arrogation: #{req.path_info}"
128
+ local_path = path
129
+ content = File.open(path).binmode.read
130
+ break
131
+ end
132
+ end
133
+
134
+ req.header.delete("HTTP_IF_MODIFIED_SINCE")
135
+
136
+ case
137
+ when content =~ /proxy-replace:\s*(.+)\s*/
138
+ content.sub!(/proxy-replace:\s*(.+)\s*/, "")
139
+ regexp = Regexp.new(Regexp.last_match[1])
140
+ puts "Replace Regexp: #{regexp.source}"
141
+ puts " <= #{local_path}"
142
+ super
143
+ case (res["Content-Encoding"] || "").downcase
144
+ #when "deflate"
145
+ #when "compress"
146
+ when "gzip"
147
+ res["Content-Encoding"] = nil
148
+ res.body = Zlib::GzipReader.wrap(StringIO.new(res.body)) {|gz| gz.read }
149
+ end
150
+
151
+ p res
152
+
153
+ m = res.body.match(regexp)
154
+ if m && m[1]
155
+ res.body[m.begin(1)..(m.end(1)-1)] = content
156
+ else
157
+ puts "In-place Regexp match failed..."
158
+ end
159
+ res["Content-Length"] = res.body.length
160
+ when content !~ /\A\s*\Z/
161
+ mime_types = WEBrick::HTTPUtils::DefaultMimeTypes.update(@config[:MimeTypes])
162
+ res.header["Content-Type"] = WEBrick::HTTPUtils.mime_type(req.path_info, mime_types)
163
+ res.body = content
164
+ puts "Rewrote: <= #{local_path}"
165
+ else
166
+ @cache = {} if !@cache || req.query.key?("clearcache")
167
+ r = @cache[req.request_uri.to_s]
168
+
169
+ if r
170
+ r.instance_variables.each do |i|
171
+ res.instance_variable_set(i, r.instance_variable_get(i))
172
+ end
173
+ $stderr.puts "From Cache: #{req.request_uri}"
174
+ else
175
+ super
176
+ unless @config[:nocache]
177
+ @cache[req.request_uri.to_s] = res.dup
178
+ $stderr.puts "Cached: #{req.request_uri}"
179
+ end
180
+ end
181
+ end
182
+ req.header["referer"] = ["http://#{req.header["host"][0]}"]
183
+ rescue Exception => e
184
+ puts $@
185
+ puts $!
186
+ end
187
+ end
188
+ end
189
+
190
+ CocProxyCommand.run(ARGV)
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cocproxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Public Domain
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-07 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Proxy which can stub certain URL to local file.
14
+ email: me@kaiinui.com
15
+ executables:
16
+ - cocproxy
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/cocproxy
21
+ homepage: https://github.com/kaiinui/cocproxy
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.3.0
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Proxy which can stub certain URL to local file.
45
+ test_files: []
46
+ has_rdoc: