ec2-api-proxy 0.1.2 → 0.1.3
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.
- data/README +8 -2
- data/lib/ec2-api-proxy/backend.rb +10 -3
- data/lib/ec2-api-proxy/constants.rb +1 -1
- data/lib/ec2-api-proxy/proxy.rb +23 -17
- data/lib/ec2-api-proxy/server.rb +2 -1
- metadata +5 -5
data/README
CHANGED
|
@@ -33,8 +33,13 @@ gem install ec2-api-proxy
|
|
|
33
33
|
debug: false
|
|
34
34
|
shell> eapctl debug true
|
|
35
35
|
|
|
36
|
-
shell>
|
|
37
|
-
shell> aws
|
|
36
|
+
shell> aws --version
|
|
37
|
+
shell> aws-cli/0.12.0 Python/2.6.8 Linux/3.4.43-43.43.amzn1.x86_64
|
|
38
|
+
# HTTP(S)_PROXY is not is not supported by old version awc cli
|
|
39
|
+
|
|
40
|
+
shell> export HTTP_PROXY=http://localhost:8080
|
|
41
|
+
shell> aws ec2 describe-instances --endpoint-url=http://ec2.ap-northeast-1.amazonaws.com
|
|
42
|
+
# HTTPS_PROXY is still unstable.
|
|
38
43
|
{
|
|
39
44
|
"Reservations": [
|
|
40
45
|
{
|
|
@@ -48,6 +53,7 @@ gem install ec2-api-proxy
|
|
|
48
53
|
shell> tail -f /var/log/ec2-api-proxy.log
|
|
49
54
|
...
|
|
50
55
|
D, [2013-07-15T20:41:28.472712 #76304] DEBUG -- : proxy: connect from 127.0.0.1:58456
|
|
56
|
+
D, [2013-07-15T20:41:28.472712 #76304] DEBUG -- : proxy: DescribeInstances (allow_cache=true)
|
|
51
57
|
D, [2013-07-15T20:41:28.529715 #76304] DEBUG -- : proxy: cache miss
|
|
52
58
|
D, [2013-07-15T20:41:29.051745 #76304] DEBUG -- : proxy: unbind connection from 127.0.0.1:58456
|
|
53
59
|
D, [2013-07-15T20:41:29.051745 #76304] DEBUG -- : backend: unbind connection
|
|
@@ -16,7 +16,14 @@ module EC2APIProxy
|
|
|
16
16
|
|
|
17
17
|
if @memcached_key and not @data_list.empty?
|
|
18
18
|
data = @data_list.join
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
if /<Response>\s*<Errors>\s*<Error>/ =~ data
|
|
21
|
+
if @proxy and @proxy.options[:debug]
|
|
22
|
+
@logger.debug("backend: error response: #{data}")
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
@proxy.memcached.set(@memcached_key, data, @proxy.options[:expires])
|
|
26
|
+
end
|
|
20
27
|
|
|
21
28
|
if @proxy and @proxy.options[:debug]
|
|
22
29
|
@logger.debug("backend: set cache (length=#{data.length})")
|
|
@@ -26,7 +33,7 @@ module EC2APIProxy
|
|
|
26
33
|
|
|
27
34
|
def receive_data(data)
|
|
28
35
|
if not @proxy or @proxy.error?
|
|
29
|
-
@logger.
|
|
36
|
+
@logger.error("backend: proxy connection error: #{data.inspect}")
|
|
30
37
|
close_proxy_connection
|
|
31
38
|
close_connection_after_writing
|
|
32
39
|
else
|
|
@@ -40,7 +47,7 @@ module EC2APIProxy
|
|
|
40
47
|
def close_proxy_connection
|
|
41
48
|
@proxy.close_connection if @proxy
|
|
42
49
|
rescue Exception => e
|
|
43
|
-
@logger.warn("#{e.class.name}: #{e.message}")
|
|
50
|
+
@logger.warn("#{e.class.name}: #{e.message}\n\tfrom #{e.backtrace.join("\n\tfrom ")}")
|
|
44
51
|
end
|
|
45
52
|
end # Backend
|
|
46
53
|
end # EC2APIProxy
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
APP_NAME = 'ec2-api-proxy'
|
|
2
|
-
Version = '0.1.
|
|
2
|
+
Version = '0.1.3'
|
data/lib/ec2-api-proxy/proxy.rb
CHANGED
|
@@ -10,10 +10,12 @@ module EC2APIProxy
|
|
|
10
10
|
attr_reader :logger
|
|
11
11
|
attr_reader :memcached
|
|
12
12
|
|
|
13
|
-
def initialize(options)
|
|
13
|
+
def initialize(options, memcached)
|
|
14
14
|
@options = options
|
|
15
|
-
@memcached =
|
|
15
|
+
@memcached = memcached
|
|
16
16
|
@logger = Logger.new($stdout)
|
|
17
|
+
@data_len = nil
|
|
18
|
+
@data = ''
|
|
17
19
|
end
|
|
18
20
|
|
|
19
21
|
def post_init
|
|
@@ -37,9 +39,20 @@ module EC2APIProxy
|
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
def receive_data(data)
|
|
42
|
+
@data << data
|
|
43
|
+
|
|
44
|
+
unless @data_len
|
|
45
|
+
content_length = data.split("\r\n").find {|i| /\AContent-Length:/i =~ i }
|
|
46
|
+
@data_len = content_length ? content_length.split(/:\s+/, 2).last.to_i : 0
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
content = @data.split("\r\n\r\n", 2).last || ''
|
|
50
|
+
@logger.debug("proxy: receive data (length=#{@data_len}, receive=#{content.length})") if @options[:debug]
|
|
51
|
+
return if content.length < @data_len
|
|
52
|
+
|
|
40
53
|
EM.defer {
|
|
41
54
|
begin
|
|
42
|
-
endpoint, params = parse_proxy_request(data)
|
|
55
|
+
endpoint, params = parse_proxy_request(@data)
|
|
43
56
|
action = (params['Action'] || []).first
|
|
44
57
|
allow_cache = !!(/\ADescribe/ =~ action)
|
|
45
58
|
key = params_to_key(params)
|
|
@@ -61,16 +74,16 @@ module EC2APIProxy
|
|
|
61
74
|
)
|
|
62
75
|
|
|
63
76
|
if @backend.error?
|
|
64
|
-
@logger.error("proxy: backend connection error: #{data.inspect}")
|
|
77
|
+
@logger.error("proxy: backend connection error: #{@data.inspect}")
|
|
65
78
|
send_error('ec2-api-proxy-backend-connection-error', 'backend connection error')
|
|
66
79
|
close_backend_connection
|
|
67
80
|
close_connection_after_writing
|
|
68
81
|
else
|
|
69
|
-
@backend.send_data(data)
|
|
82
|
+
@backend.send_data(@data)
|
|
70
83
|
end
|
|
71
84
|
end
|
|
72
85
|
rescue => e
|
|
73
|
-
@logger.
|
|
86
|
+
@logger.error("#{e.class.name}: #{e.message}\n\tfrom #{e.backtrace.join("\n\tfrom ")}")
|
|
74
87
|
send_error(e.class.name, e.message)
|
|
75
88
|
close_backend_connection
|
|
76
89
|
close_connection_after_writing
|
|
@@ -81,22 +94,15 @@ module EC2APIProxy
|
|
|
81
94
|
private
|
|
82
95
|
|
|
83
96
|
def parse_proxy_request(data)
|
|
84
|
-
|
|
85
|
-
endpoint =
|
|
86
|
-
|
|
87
|
-
data.sub!(%r{\A(GET|POST) (https?://[^/]+)}) do
|
|
88
|
-
request_method = $1
|
|
89
|
-
endpoint = $2
|
|
90
|
-
"#{request_method} "
|
|
91
|
-
end
|
|
92
|
-
|
|
97
|
+
request_line, header_body = data.split("\r\n", 2)
|
|
98
|
+
request_method, endpoint, http_version = request_line.split(/\s+/, 3)
|
|
93
99
|
endpoint = URI.parse(endpoint)
|
|
94
100
|
params = nil
|
|
95
101
|
|
|
96
102
|
if request_method =~ /GET/i
|
|
97
103
|
params = CGI.parse(endpoint.query)
|
|
98
104
|
else
|
|
99
|
-
params = CGI.parse(
|
|
105
|
+
params = CGI.parse(header_body.split(/\r\n\r\n/, 2).last)
|
|
100
106
|
end
|
|
101
107
|
|
|
102
108
|
[endpoint, params]
|
|
@@ -133,7 +139,7 @@ module EC2APIProxy
|
|
|
133
139
|
def close_backend_connection
|
|
134
140
|
@backend.close_connection if @backend
|
|
135
141
|
rescue Exception => e
|
|
136
|
-
@logger.warn("#{e.class.name}: #{e.message}")
|
|
142
|
+
@logger.warn("#{e.class.name}: #{e.message}\n\tfrom #{e.backtrace.join("\n\tfrom ")}")
|
|
137
143
|
end
|
|
138
144
|
end # Proxy
|
|
139
145
|
end # EC2APIProxy
|
data/lib/ec2-api-proxy/server.rb
CHANGED
|
@@ -39,7 +39,8 @@ module EC2APIProxy
|
|
|
39
39
|
EM.threadpool_size = @@options[:threads] if @@options[:threads]
|
|
40
40
|
|
|
41
41
|
EM.run {
|
|
42
|
-
|
|
42
|
+
memcached = Dalli::Client.new(@@options[:memcached], :compress => @@options[:compress])
|
|
43
|
+
EM.start_server(@@options[:addr], @@options[:port], EC2APIProxy::Proxy, @@control_options, memcached)
|
|
43
44
|
}
|
|
44
45
|
end
|
|
45
46
|
end # self
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ec2-api-proxy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-07-
|
|
12
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: eventmachine
|
|
@@ -68,12 +68,12 @@ extensions: []
|
|
|
68
68
|
extra_rdoc_files: []
|
|
69
69
|
files:
|
|
70
70
|
- README
|
|
71
|
-
- bin/eapctl
|
|
72
71
|
- bin/ec2-api-proxy
|
|
72
|
+
- bin/eapctl
|
|
73
73
|
- lib/ec2-api-proxy/backend.rb
|
|
74
|
-
- lib/ec2-api-proxy/constants.rb
|
|
75
|
-
- lib/ec2-api-proxy/proxy.rb
|
|
76
74
|
- lib/ec2-api-proxy/server.rb
|
|
75
|
+
- lib/ec2-api-proxy/proxy.rb
|
|
76
|
+
- lib/ec2-api-proxy/constants.rb
|
|
77
77
|
homepage: https://bitbucket.org/winebarrel/ec2-api-proxy
|
|
78
78
|
licenses: []
|
|
79
79
|
post_install_message:
|