uv-rays 2.2.2 → 2.3.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.
- checksums.yaml +4 -4
- data/README.md +11 -0
- data/lib/faraday/adapter/libuv.rb +9 -0
- data/lib/httpi/adapter/libuv.rb +9 -0
- data/lib/uv-rays/http/encoding.rb +1 -2
- data/lib/uv-rays/http/request.rb +6 -1
- data/lib/uv-rays/http_endpoint.rb +60 -12
- data/lib/uv-rays/scheduler.rb +1 -1
- data/lib/uv-rays/version.rb +1 -1
- data/spec/http_endpoint_spec.rb +55 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2071c1ca1785836a027d0c84859a9ab8f8fdd39
|
4
|
+
data.tar.gz: b82be2f6611fecd989e85693894ea4996ff16cc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d37fadf118df972c3a8e9ddeddc1142e36e3f45b24e67cfc21e54447b9570156e495d0bdf8181e96660b80e105e8cd075e52042f69c5e4337f8de3fa6bb24ab9
|
7
|
+
data.tar.gz: d962b2226429fb52d9286745881a5c2100680f5601c203780dbfe306016c1bf369ef5d26aa2bb2a4fc26cccb7f8bc7e06adce3f02cb42337602ae13f7a8e9f21
|
data/README.md
CHANGED
@@ -50,3 +50,14 @@ reactor {
|
|
50
50
|
}
|
51
51
|
|
52
52
|
```
|
53
|
+
|
54
|
+
# Integrations
|
55
|
+
|
56
|
+
UV-Rays works with many existing GEMs by integrating into common HTTP abstraction libraries
|
57
|
+
|
58
|
+
* [Faraday](https://github.com/lostisland/faraday)
|
59
|
+
* [HTTPI](https://github.com/savonrb/httpi)
|
60
|
+
* [Handsoap](https://github.com/unwire/handsoap)
|
61
|
+
|
62
|
+
|
63
|
+
|
@@ -34,6 +34,15 @@ module Faraday
|
|
34
34
|
opts[:inactivity_timeout] = (req[:timeout] * 1000) if req[:timeout]
|
35
35
|
end
|
36
36
|
|
37
|
+
if proxy = env[:request][:proxy]
|
38
|
+
opts[:proxy] = {
|
39
|
+
host: proxy[:uri].host,
|
40
|
+
port: proxy[:uri].port,
|
41
|
+
username: proxy[:user],
|
42
|
+
password: proxy[:password]
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
37
46
|
error = nil
|
38
47
|
thread = reactor
|
39
48
|
if thread.running?
|
data/lib/httpi/adapter/libuv.rb
CHANGED
@@ -21,6 +21,15 @@ class HTTPI::Adapter::Libuv < HTTPI::Adapter::Base
|
|
21
21
|
body: @request.body
|
22
22
|
}
|
23
23
|
|
24
|
+
if proxy = @request.proxy
|
25
|
+
req[:proxy] = {
|
26
|
+
host: proxy.host,
|
27
|
+
port: proxy.port,
|
28
|
+
username: proxy.user,
|
29
|
+
password: proxy.password
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
24
33
|
# Apply authentication settings
|
25
34
|
auth = @request.auth
|
26
35
|
type = auth.type
|
data/lib/uv-rays/http/request.rb
CHANGED
@@ -33,6 +33,7 @@ module UV
|
|
33
33
|
|
34
34
|
@host = endpoint.host
|
35
35
|
@port = endpoint.port
|
36
|
+
@http_proxy = endpoint.http_proxy? ? endpoint.proxy : nil
|
36
37
|
@encoded_host = endpoint.encoded_host
|
37
38
|
|
38
39
|
path = options[:path]
|
@@ -46,6 +47,7 @@ module UV
|
|
46
47
|
@cookiejar = endpoint.cookiejar
|
47
48
|
@middleware = endpoint.middleware
|
48
49
|
@uri = "#{endpoint.scheme}://#{@encoded_host}#{@path}"
|
50
|
+
@path = @uri if @http_proxy
|
49
51
|
endpoint = nil
|
50
52
|
|
51
53
|
@options = options
|
@@ -139,7 +141,10 @@ module UV
|
|
139
141
|
head['content-type'] = 'application/x-www-form-urlencoded'
|
140
142
|
end
|
141
143
|
|
142
|
-
request_header = encode_request(method, path, query)
|
144
|
+
request_header = encode_request(method, @path, query)
|
145
|
+
if @http_proxy && (@http_proxy[:username] || @http_proxy[:password])
|
146
|
+
request_header << encode_auth('Proxy-Authorization', [@http_proxy[:username], @http_proxy[:password]])
|
147
|
+
end
|
143
148
|
request_header << encode_headers(head)
|
144
149
|
request_header << CRLF
|
145
150
|
|
@@ -33,33 +33,76 @@ module UV
|
|
33
33
|
end
|
34
34
|
end # CookieJar
|
35
35
|
|
36
|
+
# HTTPS Proxy - connect to proxy
|
37
|
+
# CONNECT #{target_host}:#{target_port} HTTP/1.0\r\n"
|
38
|
+
# Proxy-Authorization: Basic #{encoded_credentials}\r\n
|
39
|
+
# \r\n
|
40
|
+
# Parse response =~ %r{\AHTTP/1\.[01] 200 .*\r\n\r\n}m
|
41
|
+
# use_tls
|
42
|
+
# send requests as usual
|
43
|
+
|
44
|
+
# HTTP Proxy - connect to proxy
|
45
|
+
# GET #{url_with_host} HTTP/1.1\r\n"
|
46
|
+
# Proxy-Authorization: Basic #{encoded_credentials}\r\n
|
47
|
+
# \r\n
|
48
|
+
|
36
49
|
class HttpEndpoint
|
37
50
|
class Connection < OutboundConnection
|
38
|
-
def initialize(host, port, tls, client)
|
51
|
+
def initialize(host, port, tls, proxy, client)
|
52
|
+
@target_host = host
|
39
53
|
@client = client
|
40
54
|
@request = nil
|
41
|
-
super(host, port)
|
42
55
|
|
43
|
-
if
|
44
|
-
|
45
|
-
|
56
|
+
if proxy
|
57
|
+
super(proxy[:host], proxy[:port])
|
58
|
+
connect_send_handshake(host, port, proxy) if tls
|
59
|
+
else
|
60
|
+
super(host, port)
|
61
|
+
start_tls if tls
|
46
62
|
end
|
47
63
|
end
|
48
64
|
|
65
|
+
def start_tls
|
66
|
+
opts = {host_name: @target_host}.merge(@client.tls_options)
|
67
|
+
use_tls(opts)
|
68
|
+
end
|
69
|
+
|
70
|
+
def connect_send_handshake(target_host, target_port, proxy)
|
71
|
+
@negotiating = true
|
72
|
+
header = String.new("CONNECT #{target_host}:#{target_port} HTTP/1.0\r\n")
|
73
|
+
if proxy[:username] || proxy[:password]
|
74
|
+
encoded_credentials = Base64.strict_encode64([proxy[:username], proxy[:password]].join(":"))
|
75
|
+
header << "Proxy-Authorization: Basic #{encoded_credentials}\r\n"
|
76
|
+
end
|
77
|
+
header << "\r\n"
|
78
|
+
write(header)
|
79
|
+
end
|
80
|
+
|
49
81
|
attr_accessor :request, :reason
|
50
82
|
|
51
|
-
def on_read(data, *args)
|
52
|
-
@
|
83
|
+
def on_read(data, *args)
|
84
|
+
if @negotiating
|
85
|
+
@negotiating = false
|
86
|
+
if data =~ %r{\AHTTP/1\.[01] 200 .*\r\n\r\n}m
|
87
|
+
start_tls
|
88
|
+
@client.connection_ready
|
89
|
+
else
|
90
|
+
@reason = "Unexpected response from proxy: #{data}"
|
91
|
+
close_connection
|
92
|
+
end
|
93
|
+
else
|
94
|
+
@client.data_received(data)
|
95
|
+
end
|
53
96
|
end
|
54
97
|
|
55
98
|
def post_init(*args)
|
56
99
|
end
|
57
100
|
|
58
|
-
def on_connect(transport)
|
59
|
-
@client.connection_ready
|
101
|
+
def on_connect(transport)
|
102
|
+
@client.connection_ready unless @negotiating
|
60
103
|
end
|
61
104
|
|
62
|
-
def on_close
|
105
|
+
def on_close
|
63
106
|
@client.connection_closed(@request, @reason)
|
64
107
|
ensure
|
65
108
|
@request = nil
|
@@ -100,6 +143,7 @@ module UV
|
|
100
143
|
|
101
144
|
default_port = uri.port == uri.default_port
|
102
145
|
@encoded_host = default_port ? @host : "#{@host}:#{@port}"
|
146
|
+
@proxy = @options[:proxy]
|
103
147
|
|
104
148
|
@scheme = uri.scheme
|
105
149
|
@tls = @scheme == 'https'
|
@@ -110,7 +154,7 @@ module UV
|
|
110
154
|
|
111
155
|
attr_accessor :inactivity_timeout
|
112
156
|
attr_reader :tls_options, :port, :host, :tls, :scheme, :encoded_host
|
113
|
-
attr_reader :cookiejar, :middleware, :thread
|
157
|
+
attr_reader :cookiejar, :middleware, :thread, :proxy
|
114
158
|
|
115
159
|
|
116
160
|
def get(options = {}); request(:get, options); end
|
@@ -191,6 +235,10 @@ module UV
|
|
191
235
|
close_connection
|
192
236
|
end
|
193
237
|
|
238
|
+
def http_proxy?
|
239
|
+
@proxy && !@tls
|
240
|
+
end
|
241
|
+
|
194
242
|
|
195
243
|
private
|
196
244
|
|
@@ -211,7 +259,7 @@ module UV
|
|
211
259
|
|
212
260
|
def new_connection
|
213
261
|
if @queue.length > 0 && @connection.nil?
|
214
|
-
@connection = Connection.new(@host, @port, @tls, self)
|
262
|
+
@connection = Connection.new(@host, @port, @tls, @proxy, self)
|
215
263
|
start_timer
|
216
264
|
end
|
217
265
|
@connection
|
data/lib/uv-rays/scheduler.rb
CHANGED
@@ -259,7 +259,7 @@ module UV
|
|
259
259
|
# @param schedule [String] a standard CRON job line.
|
260
260
|
# @param callback [Proc] a block or method to execute when the event triggers
|
261
261
|
# @return [::UV::Repeat]
|
262
|
-
def cron(schedule, callback = nil, timezone: nil
|
262
|
+
def cron(schedule, callback = nil, timezone: nil, &block)
|
263
263
|
callback ||= block
|
264
264
|
ms = Scheduler.parse_cron(schedule, timezone: timezone)
|
265
265
|
event = Repeat.new(self, ms)
|
data/lib/uv-rays/version.rb
CHANGED
data/spec/http_endpoint_spec.rb
CHANGED
@@ -186,7 +186,7 @@ describe UV::HttpEndpoint do
|
|
186
186
|
@reactor.stop
|
187
187
|
@general_failure << "test timed out"
|
188
188
|
end
|
189
|
-
@timeout.start(
|
189
|
+
@timeout.start(10000)
|
190
190
|
|
191
191
|
@request_failure = proc { |err|
|
192
192
|
@general_failure << err
|
@@ -579,4 +579,58 @@ describe UV::HttpEndpoint do
|
|
579
579
|
expect(@error2).to eq(:connection_failure)
|
580
580
|
end
|
581
581
|
end
|
582
|
+
|
583
|
+
=begin
|
584
|
+
describe 'proxy support' do
|
585
|
+
it "should work with a HTTP proxy server" do
|
586
|
+
@reactor.run { |reactor|
|
587
|
+
server = UV::HttpEndpoint.new 'http://www.whatsmyip.org', {
|
588
|
+
#inactivity_timeout: 1000,
|
589
|
+
proxy: {
|
590
|
+
host: '212.47.252.49',
|
591
|
+
port: 3128
|
592
|
+
}
|
593
|
+
}
|
594
|
+
|
595
|
+
@response = nil
|
596
|
+
|
597
|
+
request = server.get(:path => '/', headers: {accept: 'text/html'})
|
598
|
+
request.then(proc { |response|
|
599
|
+
@response = response
|
600
|
+
@reactor.stop
|
601
|
+
}, proc { |error|
|
602
|
+
@error = error
|
603
|
+
})
|
604
|
+
}
|
605
|
+
|
606
|
+
expect(@general_failure).to eq([])
|
607
|
+
expect(@response.status).to eq(200)
|
608
|
+
end
|
609
|
+
|
610
|
+
it "should work with a HTTPS proxy server" do
|
611
|
+
@reactor.run { |reactor|
|
612
|
+
server = UV::HttpEndpoint.new 'https://www.google.com.au', {
|
613
|
+
#inactivity_timeout: 1000,
|
614
|
+
proxy: {
|
615
|
+
host: '212.47.252.49',
|
616
|
+
port: 3128
|
617
|
+
}
|
618
|
+
}
|
619
|
+
|
620
|
+
@response = nil
|
621
|
+
|
622
|
+
request = server.get(:path => '/', headers: {accept: 'text/html'})
|
623
|
+
request.then(proc { |response|
|
624
|
+
@response = response
|
625
|
+
@reactor.stop
|
626
|
+
}, proc { |error|
|
627
|
+
@error = error
|
628
|
+
})
|
629
|
+
}
|
630
|
+
|
631
|
+
expect(@general_failure).to eq([])
|
632
|
+
expect(@response.status).to eq(200)
|
633
|
+
end
|
634
|
+
end
|
635
|
+
=end
|
582
636
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uv-rays
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen von Takach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libuv
|
@@ -280,7 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
280
280
|
version: '0'
|
281
281
|
requirements: []
|
282
282
|
rubyforge_project:
|
283
|
-
rubygems_version: 2.6.
|
283
|
+
rubygems_version: 2.6.14
|
284
284
|
signing_key:
|
285
285
|
specification_version: 4
|
286
286
|
summary: Abstractions for working with Libuv
|