uv-rays 1.3.2 → 1.3.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.
- checksums.yaml +4 -4
- data/lib/uv-rays/http/request.rb +48 -13
- data/lib/uv-rays/version.rb +1 -1
- data/spec/http_endpoint_spec.rb +61 -1
- data/uv-rays.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47bdebc71e47d424d3e778931cc693ccbc0607fc
|
4
|
+
data.tar.gz: 41b8f4ea19d9333a5c767383607b9368f2a6f593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6dc0c3c3e1bf6d395bcf15244e9bee66f510866a66e44c8e4c99a79760d7f2f5da221237ece5c7a726b81a7f4c808f1e958890e0390ba5cd33ea935c8f9113b
|
7
|
+
data.tar.gz: ede1b848ca18a236c093ec49723b457f4cd33aeffda61e561fe22099dcb1478e4ead18850131819d4e74bbcac6aa95fac129bcf6d3946555539461bbd9f64a75
|
data/lib/uv-rays/http/request.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'cgi'
|
1
3
|
require 'rubyntlm'
|
4
|
+
require 'net/http/digest_auth'
|
2
5
|
|
3
6
|
module UV
|
4
7
|
module Http
|
@@ -29,10 +32,12 @@ module UV
|
|
29
32
|
@options = options
|
30
33
|
@endpoint = endpoint
|
31
34
|
@ntlm_creds = options[:ntlm]
|
35
|
+
@digest_creds = options[:digest]
|
36
|
+
@challenge_retries = 0
|
32
37
|
|
33
38
|
@path = options[:path]
|
34
39
|
@method = options[:method]
|
35
|
-
@uri = "#{endpoint.scheme}
|
40
|
+
@uri = "#{endpoint.scheme}://#{encode_host(endpoint.host, endpoint.port)}#{@path}"
|
36
41
|
|
37
42
|
@error = proc { |reason| reject(reason) }
|
38
43
|
end
|
@@ -40,17 +45,34 @@ module UV
|
|
40
45
|
|
41
46
|
|
42
47
|
def resolve(response, parser = nil)
|
43
|
-
if response.status == 401 && @
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
if response.status == 401 && @challenge_retries == 0 && response[:"WWW-Authenticate"]
|
49
|
+
challenge = response[:"WWW-Authenticate"]
|
50
|
+
|
51
|
+
begin
|
52
|
+
if @ntlm_creds && challenge[0..3] == 'NTLM'
|
53
|
+
@options[:headers] ||= {}
|
54
|
+
@options[:headers][:Authorization] = ntlm_auth_header(challenge)
|
55
|
+
@challenge_retries += 1
|
56
|
+
|
57
|
+
execute(@transport)
|
58
|
+
return false
|
59
|
+
elsif @digest_creds && challenge[0..5] == 'Digest'
|
60
|
+
@options[:headers] ||= {}
|
61
|
+
@options[:headers][:Authorization] = digest_auth_header(challenge)
|
62
|
+
@challenge_retries += 1
|
63
|
+
|
64
|
+
execute(@transport)
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
rescue => e
|
68
|
+
reject e
|
69
|
+
true
|
70
|
+
end
|
53
71
|
end
|
72
|
+
|
73
|
+
@transport = nil
|
74
|
+
@defer.resolve(response)
|
75
|
+
true
|
54
76
|
end
|
55
77
|
|
56
78
|
def reject(reason)
|
@@ -68,7 +90,12 @@ module UV
|
|
68
90
|
@transport = transport
|
69
91
|
|
70
92
|
@endpoint.middleware.each do |m|
|
71
|
-
|
93
|
+
begin
|
94
|
+
head, body = m.request(self, head, body) if m.respond_to?(:request)
|
95
|
+
rescue => e
|
96
|
+
reject e
|
97
|
+
return
|
98
|
+
end
|
72
99
|
end
|
73
100
|
|
74
101
|
body = body.is_a?(Hash) ? form_encode_body(body) : body
|
@@ -191,7 +218,6 @@ module UV
|
|
191
218
|
return @ntlm_auth
|
192
219
|
end
|
193
220
|
else
|
194
|
-
@ntlm_retries = 0
|
195
221
|
domain = @ntlm_creds[:domain]
|
196
222
|
t1 = Net::NTLM::Message::Type1.new()
|
197
223
|
t1.domain = domain if domain
|
@@ -205,6 +231,15 @@ module UV
|
|
205
231
|
return nil if scheme.nil?
|
206
232
|
return scheme, param_str
|
207
233
|
end
|
234
|
+
|
235
|
+
def digest_auth_header(challenge)
|
236
|
+
uri = URI.parse @uri
|
237
|
+
uri.userinfo = "#{CGI::escape(@digest_creds[:user])}:#{CGI::escape(@digest_creds[:password])}"
|
238
|
+
|
239
|
+
digest_auth = Net::HTTP::DigestAuth.new
|
240
|
+
auth = digest_auth.auth_header uri, challenge, method.to_s.upcase
|
241
|
+
auth
|
242
|
+
end
|
208
243
|
end
|
209
244
|
end
|
210
245
|
end
|
data/lib/uv-rays/version.rb
CHANGED
data/spec/http_endpoint_spec.rb
CHANGED
@@ -47,6 +47,33 @@ module NTLMServer
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
module DigestServer
|
51
|
+
def post_init
|
52
|
+
@parser = ::HttpParser::Parser.new(self)
|
53
|
+
@state = ::HttpParser::Parser.new_instance
|
54
|
+
@state.type = :request
|
55
|
+
|
56
|
+
@req = 0
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_message_complete(parser)
|
60
|
+
if @req == 0
|
61
|
+
@state = ::HttpParser::Parser.new_instance
|
62
|
+
write("HTTP/1.1 401 Unauthorized\r\nWWW-Authenticate: Digest realm=\"testrealm@host.com\",qop=\"auth,auth-int\",nonce=\"dcd98b7102dd2f0e8b11d0f600bfb0c093\",opaque=\"5ccc069c403ebaf9f0171e9517f40e41\"\r\nContent-type: text/html\r\nContent-length: 0\r\n\r\n")
|
63
|
+
else
|
64
|
+
write("HTTP/1.1 200 OK\r\nContent-type: text/html\r\nContent-length: 1\r\n\r\nd")
|
65
|
+
end
|
66
|
+
@req += 1
|
67
|
+
end
|
68
|
+
|
69
|
+
def on_read(data, connection)
|
70
|
+
if @parser.parse(@state, data)
|
71
|
+
p 'parse error'
|
72
|
+
p @state.error
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
50
77
|
module OldServer
|
51
78
|
def post_init
|
52
79
|
@parser = ::HttpParser::Parser.new(self)
|
@@ -336,7 +363,7 @@ describe UV::HttpEndpoint do
|
|
336
363
|
end
|
337
364
|
end
|
338
365
|
|
339
|
-
describe '
|
366
|
+
describe 'Auth support' do
|
340
367
|
it "should perform NTLM auth transparently" do
|
341
368
|
@loop.run { |logger|
|
342
369
|
logger.progress do |level, errorid, error|
|
@@ -370,6 +397,39 @@ describe UV::HttpEndpoint do
|
|
370
397
|
expect(@response.keep_alive).to eq(true)
|
371
398
|
expect(@response.body).to eq('y')
|
372
399
|
end
|
400
|
+
|
401
|
+
it "should perform Digest auth transparently" do
|
402
|
+
@loop.run { |logger|
|
403
|
+
logger.progress do |level, errorid, error|
|
404
|
+
begin
|
405
|
+
@general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
|
406
|
+
rescue Exception
|
407
|
+
@general_failure << 'error in logger'
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
tcp = UV.start_server '127.0.0.1', 3252, DigestServer
|
412
|
+
server = UV::HttpEndpoint.new 'http://127.0.0.1:3252', digest: {
|
413
|
+
user: 'Mufasa',
|
414
|
+
password: 'Circle Of Life'
|
415
|
+
}
|
416
|
+
|
417
|
+
request = server.get(path: '/dir/index.html')
|
418
|
+
request.then(proc { |response|
|
419
|
+
@response = response
|
420
|
+
tcp.close
|
421
|
+
@loop.stop
|
422
|
+
}, @request_failure)
|
423
|
+
}
|
424
|
+
|
425
|
+
expect(@general_failure).to eq([])
|
426
|
+
expect(@response[:"Content-type"]).to eq('text/html')
|
427
|
+
expect(@response.http_version).to eq('1.1')
|
428
|
+
expect(@response.status).to eq(200)
|
429
|
+
expect(@response.cookies).to eq({})
|
430
|
+
expect(@response.keep_alive).to eq(true)
|
431
|
+
expect(@response.body).to eq('d')
|
432
|
+
end
|
373
433
|
end
|
374
434
|
|
375
435
|
describe 'when things go wrong' do
|
data/uv-rays.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_runtime_dependency 'addressable'
|
22
22
|
gem.add_runtime_dependency 'http-parser', '>= 1.0.4'
|
23
23
|
gem.add_runtime_dependency 'rubyntlm'
|
24
|
+
gem.add_runtime_dependency 'net-http-digest_auth'
|
24
25
|
|
25
26
|
gem.add_development_dependency 'rspec', '>= 2.14'
|
26
27
|
gem.add_development_dependency 'rake', '>= 10.1'
|
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: 1.3.
|
4
|
+
version: 1.3.3
|
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: 2016-
|
11
|
+
date: 2016-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libuv
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: net-http-digest_auth
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rspec
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -216,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
230
|
version: '0'
|
217
231
|
requirements: []
|
218
232
|
rubyforge_project:
|
219
|
-
rubygems_version: 2.
|
233
|
+
rubygems_version: 2.5.1
|
220
234
|
signing_key:
|
221
235
|
specification_version: 4
|
222
236
|
summary: Abstractions for working with Libuv
|