uv-rays 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
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