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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93ce972cd6ea7be66d23ff808f002069f3cb415a
4
- data.tar.gz: 4bffabf548b5202db3d07639a23ff9c4a110374e
3
+ metadata.gz: 47bdebc71e47d424d3e778931cc693ccbc0607fc
4
+ data.tar.gz: 41b8f4ea19d9333a5c767383607b9368f2a6f593
5
5
  SHA512:
6
- metadata.gz: 38a0cae2dd632d27afe0b7283a41087495ad42ed44ffc0b72b938262983a51c6660404ebcd7ea4a9103a55dabd40b0af15924f0934275c93d6cf41207c563270
7
- data.tar.gz: a0ed6205afdda3bd31dda92e218d6d1d52d9c92114ba95c9bd3355a5c51f6e691907fc48b54c35d53d25ccc98550243cc190f5a3134f01ac65f1ec47e64a4636
6
+ metadata.gz: d6dc0c3c3e1bf6d395bcf15244e9bee66f510866a66e44c8e4c99a79760d7f2f5da221237ece5c7a726b81a7f4c808f1e958890e0390ba5cd33ea935c8f9113b
7
+ data.tar.gz: ede1b848ca18a236c093ec49723b457f4cd33aeffda61e561fe22099dcb1478e4ead18850131819d4e74bbcac6aa95fac129bcf6d3946555539461bbd9f64a75
@@ -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}#{encode_host(endpoint.host, endpoint.port)}#{@path}"
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 && @ntlm_creds && @ntlm_retries == 0 && response[:"WWW-Authenticate"]
44
- @options[:headers][:Authorization] = ntlm_auth_header(response[:"WWW-Authenticate"])
45
- @ntlm_retries += 1
46
-
47
- execute(@transport)
48
- false
49
- else
50
- @transport = nil
51
- @defer.resolve(response)
52
- true
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
- head, body = m.request(self, head, body) if m.respond_to?(:request)
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
@@ -1,3 +1,3 @@
1
1
  module UV
2
- VERSION = '1.3.2'
2
+ VERSION = '1.3.3'
3
3
  end
@@ -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 'NTLM auth support' do
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.2
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-04-15 00:00:00.000000000 Z
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.4.6
233
+ rubygems_version: 2.5.1
220
234
  signing_key:
221
235
  specification_version: 4
222
236
  summary: Abstractions for working with Libuv