httpclient 2.1.1 → 2.1.2
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/lib/httpclient.rb +101 -17
- data/lib/httpclient/cacert.p7s +18 -31
- data/lib/httpclient/http.rb +5 -3
- metadata +2 -2
data/lib/httpclient.rb
CHANGED
@@ -52,9 +52,9 @@ require 'httpclient/cookie'
|
|
52
52
|
#
|
53
53
|
class HTTPClient
|
54
54
|
|
55
|
-
VERSION = '2.1.
|
55
|
+
VERSION = '2.1.2'
|
56
56
|
RUBY_VERSION_STRING = "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
57
|
-
s = %w$Id: httpclient.rb
|
57
|
+
s = %w$Id: httpclient.rb 187 2007-09-22 14:15:42Z nahi $
|
58
58
|
RCS_FILE, RCS_REVISION = s[1][/.*(?=,v$)/], s[2]
|
59
59
|
|
60
60
|
SSLEnabled = begin
|
@@ -64,6 +64,13 @@ class HTTPClient
|
|
64
64
|
false
|
65
65
|
end
|
66
66
|
|
67
|
+
NTLMEnabled = begin
|
68
|
+
require 'net/ntlm'
|
69
|
+
true
|
70
|
+
rescue LoadError
|
71
|
+
false
|
72
|
+
end
|
73
|
+
|
67
74
|
SSPIEnabled = begin
|
68
75
|
require 'win32/sspi'
|
69
76
|
true
|
@@ -152,7 +159,7 @@ class SSLConfig # :nodoc:
|
|
152
159
|
@timeout = nil
|
153
160
|
@options = defined?(OpenSSL::SSL::OP_ALL) ?
|
154
161
|
OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv2 : nil
|
155
|
-
@ciphers = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"
|
162
|
+
@ciphers = "ALL:!ADH:!LOW:!EXP:!MD5:+SSLv2:@STRENGTH"
|
156
163
|
load_cacerts
|
157
164
|
end
|
158
165
|
|
@@ -357,9 +364,9 @@ private
|
|
357
364
|
require 'openssl'
|
358
365
|
dist_cert =<<__DIST_CERT__
|
359
366
|
-----BEGIN CERTIFICATE-----
|
360
|
-
MIIC/
|
367
|
+
MIIC/jCCAmegAwIBAgIBATANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJKUDER
|
361
368
|
MA8GA1UECgwIY3Rvci5vcmcxFDASBgNVBAsMC0RldmVsb3BtZW50MRUwEwYDVQQD
|
362
|
-
|
369
|
+
DAxodHRwLWFjY2VzczIwHhcNMDcwOTExMTM1ODMxWhcNMDkwOTEwMTM1ODMxWjBN
|
363
370
|
MQswCQYDVQQGEwJKUDERMA8GA1UECgwIY3Rvci5vcmcxFDASBgNVBAsMC0RldmVs
|
364
371
|
b3BtZW50MRUwEwYDVQQDDAxodHRwLWFjY2VzczIwgZ8wDQYJKoZIhvcNAQEBBQAD
|
365
372
|
gY0AMIGJAoGBALi66ujWtUCQm5HpMSyr/AAIFYVXC/dmn7C8TR/HMiUuW3waY4uX
|
@@ -369,11 +376,11 @@ ge0wgeowDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9PcGVu
|
|
369
376
|
U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUJNE0GGaRKmN2qhnO
|
370
377
|
FyBWVl4Qj6owDgYDVR0PAQH/BAQDAgEGMHUGA1UdIwRuMGyAFCTRNBhmkSpjdqoZ
|
371
378
|
zhcgVlZeEI+qoVGkTzBNMQswCQYDVQQGEwJKUDERMA8GA1UECgwIY3Rvci5vcmcx
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
379
|
+
FDASBgNVBAsMC0RldmVsb3BtZW50MRUwEwYDVQQDDAxodHRwLWFjY2VzczKCAQEw
|
380
|
+
DQYJKoZIhvcNAQEFBQADgYEAH11tstSUuqFpMqoh/vM5l3Nqb8ygblbqEYQs/iG/
|
381
|
+
UeQkOZk/P1TxB6Ozn2htJ1srqDpUsncFVZ/ecP19GkeOZ6BmIhppcHhE5WyLBcPX
|
382
|
+
It5q1BW0PiAzT9LlEGoaiW0nw39so0Pr1whJDfc1t4fjdk+kSiMIzRHbTDvHWfpV
|
383
|
+
nTA=
|
377
384
|
-----END CERTIFICATE-----
|
378
385
|
__DIST_CERT__
|
379
386
|
p7 = OpenSSL::PKCS7.read_smime(File.open(file) { |f| f.read })
|
@@ -517,6 +524,79 @@ end
|
|
517
524
|
#
|
518
525
|
class NegotiateAuth # :nodoc:
|
519
526
|
attr_reader :scheme
|
527
|
+
attr_reader :ntlm_opt
|
528
|
+
|
529
|
+
def initialize
|
530
|
+
@auth = {}
|
531
|
+
@auth_default = nil
|
532
|
+
@challenge = {}
|
533
|
+
@scheme = "Negotiate"
|
534
|
+
@ntlm_opt = {
|
535
|
+
:ntlmv2 => true
|
536
|
+
}
|
537
|
+
end
|
538
|
+
|
539
|
+
def reset_challenge
|
540
|
+
@challenge.clear
|
541
|
+
end
|
542
|
+
|
543
|
+
def set(uri, user, passwd)
|
544
|
+
if uri
|
545
|
+
uri = Util.uri_dirname(uri)
|
546
|
+
@auth[uri] = [user, passwd]
|
547
|
+
else
|
548
|
+
@auth_default = [user, passwd]
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
def get(req)
|
553
|
+
return nil unless NTLMEnabled
|
554
|
+
target_uri = req.header.request_uri
|
555
|
+
param = Util.hash_find_value(@challenge) { |uri, param|
|
556
|
+
Util.uri_part_of(target_uri, uri)
|
557
|
+
}
|
558
|
+
return nil unless param
|
559
|
+
user, passwd = Util.hash_find_value(@auth) { |uri, auth_data|
|
560
|
+
Util.uri_part_of(target_uri, uri)
|
561
|
+
}
|
562
|
+
unless user
|
563
|
+
user, passwd = @auth_default
|
564
|
+
end
|
565
|
+
return nil unless user
|
566
|
+
state = param[:state]
|
567
|
+
authphrase = param[:authphrase]
|
568
|
+
case state
|
569
|
+
when :init
|
570
|
+
t1 = Net::NTLM::Message::Type1.new
|
571
|
+
return t1.encode64
|
572
|
+
when :response
|
573
|
+
t2 = Net::NTLM::Message.decode64(authphrase)
|
574
|
+
t3 = t2.response({:user => user, :password => passwd}, @ntlm_opt)
|
575
|
+
return t3.encode64
|
576
|
+
end
|
577
|
+
nil
|
578
|
+
end
|
579
|
+
|
580
|
+
def challenge(uri, param_str)
|
581
|
+
return false unless NTLMEnabled
|
582
|
+
if param_str.nil? or @challenge[uri].nil?
|
583
|
+
c = @challenge[uri] = {}
|
584
|
+
c[:state] = :init
|
585
|
+
c[:authphrase] = ""
|
586
|
+
else
|
587
|
+
c = @challenge[uri]
|
588
|
+
c[:state] = :response
|
589
|
+
c[:authphrase] = param_str
|
590
|
+
end
|
591
|
+
true
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
|
596
|
+
# HTTPClient::SSPINegotiateAuth
|
597
|
+
#
|
598
|
+
class SSPINegotiateAuth # :nodoc:
|
599
|
+
attr_reader :scheme
|
520
600
|
|
521
601
|
def initialize
|
522
602
|
@challenge = {}
|
@@ -607,6 +687,7 @@ class WWWAuth < AuthFilterBase # :nodoc:
|
|
607
687
|
def set_auth(uri, user, passwd)
|
608
688
|
@basic_auth.set(uri, user, passwd)
|
609
689
|
@digest_auth.set(uri, user, passwd)
|
690
|
+
@negotiate_auth.set(uri, user, passwd)
|
610
691
|
end
|
611
692
|
|
612
693
|
def filter_request(req)
|
@@ -642,12 +723,14 @@ end
|
|
642
723
|
class ProxyAuth < AuthFilterBase # :nodoc:
|
643
724
|
attr_reader :basic_auth
|
644
725
|
attr_reader :negotiate_auth
|
726
|
+
attr_reader :sspi_negotiate_auth
|
645
727
|
|
646
728
|
def initialize
|
647
729
|
@basic_auth = BasicAuth.new
|
648
730
|
@negotiate_auth = NegotiateAuth.new
|
731
|
+
@sspi_negotiate_auth = SSPINegotiateAuth.new
|
649
732
|
# sort authenticators by priority
|
650
|
-
@authenticator = [@negotiate_auth, @basic_auth]
|
733
|
+
@authenticator = [@negotiate_auth, @sspi_negotiate_auth, @basic_auth]
|
651
734
|
end
|
652
735
|
|
653
736
|
def reset_challenge
|
@@ -658,6 +741,7 @@ class ProxyAuth < AuthFilterBase # :nodoc:
|
|
658
741
|
|
659
742
|
def set_auth(user, passwd)
|
660
743
|
@basic_auth.set(nil, user, passwd)
|
744
|
+
@negotiate_auth.set(nil, user, passwd)
|
661
745
|
end
|
662
746
|
|
663
747
|
def filter_request(req)
|
@@ -1093,11 +1177,10 @@ end
|
|
1093
1177
|
|
1094
1178
|
# HTTPClient::DebugSocket -- debugging support
|
1095
1179
|
#
|
1096
|
-
|
1097
|
-
|
1180
|
+
module DebugSocket
|
1181
|
+
extend SocketWrap
|
1098
1182
|
|
1099
|
-
def
|
1100
|
-
super(socket)
|
1183
|
+
def debug_dev=(debug_dev)
|
1101
1184
|
@debug_dev = debug_dev
|
1102
1185
|
end
|
1103
1186
|
|
@@ -1415,7 +1498,8 @@ private
|
|
1415
1498
|
end
|
1416
1499
|
if @debug_dev
|
1417
1500
|
@debug_dev << "! CONNECTION ESTABLISHED\n"
|
1418
|
-
socket
|
1501
|
+
socket.extend(DebugSocket)
|
1502
|
+
socket.debug_dev = @debug_dev
|
1419
1503
|
end
|
1420
1504
|
rescue SystemCallError => e
|
1421
1505
|
e.message << " (#{site})"
|
@@ -1489,7 +1573,7 @@ private
|
|
1489
1573
|
return [@version, @status, @reason]
|
1490
1574
|
end
|
1491
1575
|
|
1492
|
-
StatusParseRegexp = %r(\AHTTP/(\d+\.\d+)\s+(\d
|
1576
|
+
StatusParseRegexp = %r(\AHTTP/(\d+\.\d+)\s+(\d\d\d)\s*([^\r\n]+)?\r?\n\z)
|
1493
1577
|
def parse_header(socket)
|
1494
1578
|
begin
|
1495
1579
|
timeout(@receive_timeout) do
|
data/lib/httpclient/cacert.p7s
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
MIME-Version: 1.0
|
2
|
-
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----
|
2
|
+
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----8B5C3F7F4B46AC7A36EDE5247D3D6E76"
|
3
3
|
|
4
4
|
This is an S/MIME signed message
|
5
5
|
|
6
|
-
------
|
6
|
+
------8B5C3F7F4B46AC7A36EDE5247D3D6E76
|
7
7
|
-----BEGIN CERTIFICATE-----
|
8
8
|
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
|
9
9
|
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
@@ -420,19 +420,6 @@ T9oT95mvPtDPjqZyorPDBZrJJ32SzH5SjbOrcG2eiZ9N6xp1wpiq1QIW1wyKvyXk
|
|
420
420
|
ysiUFnZflGEo8IWnObvXi9moshMdVAk0JH0ggX1mfqKQdFwQxr3sqxvC
|
421
421
|
-----END CERTIFICATE-----
|
422
422
|
-----BEGIN CERTIFICATE-----
|
423
|
-
MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD
|
424
|
-
VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv
|
425
|
-
b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV
|
426
|
-
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU
|
427
|
-
cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv
|
428
|
-
RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M
|
429
|
-
ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5
|
430
|
-
1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz
|
431
|
-
dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl
|
432
|
-
IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy
|
433
|
-
bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY
|
434
|
-
-----END CERTIFICATE-----
|
435
|
-
-----BEGIN CERTIFICATE-----
|
436
423
|
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
|
437
424
|
VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
|
438
425
|
bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
|
@@ -915,16 +902,16 @@ YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
|
|
915
902
|
1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
|
916
903
|
-----END CERTIFICATE-----
|
917
904
|
|
918
|
-
------
|
905
|
+
------8B5C3F7F4B46AC7A36EDE5247D3D6E76
|
919
906
|
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
|
920
907
|
Content-Transfer-Encoding: base64
|
921
908
|
Content-Disposition: attachment; filename="smime.p7s"
|
922
909
|
|
923
910
|
MIIE5gYJKoZIhvcNAQcCoIIE1zCCBNMCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3
|
924
|
-
DQEHAaCCAwIwggL+
|
911
|
+
DQEHAaCCAwIwggL+MIICZ6ADAgECAgEBMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV
|
925
912
|
BAYTAkpQMREwDwYDVQQKDAhjdG9yLm9yZzEUMBIGA1UECwwLRGV2ZWxvcG1lbnQx
|
926
|
-
|
927
|
-
|
913
|
+
FTATBgNVBAMMDGh0dHAtYWNjZXNzMjAeFw0wNzA5MTExMzU4MzFaFw0wOTA5MTAx
|
914
|
+
MzU4MzFaME0xCzAJBgNVBAYTAkpQMREwDwYDVQQKDAhjdG9yLm9yZzEUMBIGA1UE
|
928
915
|
CwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDGh0dHAtYWNjZXNzMjCBnzANBgkqhkiG
|
929
916
|
9w0BAQEFAAOBjQAwgYkCgYEAuLrq6Na1QJCbkekxLKv8AAgVhVcL92afsLxNH8cy
|
930
917
|
JS5bfBpji5csWoIMAY5fiB/Xvulf5v323ealqICMm6pzznwP3EQQLOENaBd0tuFG
|
@@ -934,19 +921,19 @@ dWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQk0TQY
|
|
934
921
|
ZpEqY3aqGc4XIFZWXhCPqjAOBgNVHQ8BAf8EBAMCAQYwdQYDVR0jBG4wbIAUJNE0
|
935
922
|
GGaRKmN2qhnOFyBWVl4Qj6qhUaRPME0xCzAJBgNVBAYTAkpQMREwDwYDVQQKDAhj
|
936
923
|
dG9yLm9yZzEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDGh0dHAtYWNj
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
924
|
+
ZXNzMoIBATANBgkqhkiG9w0BAQUFAAOBgQAfXW2y1JS6oWkyqiH+8zmXc2pvzKBu
|
925
|
+
VuoRhCz+Ib9R5CQ5mT8/VPEHo7OfaG0nWyuoOlSydwVVn95w/X0aR45noGYiGmlw
|
926
|
+
eETlbIsFw9ci3mrUFbQ+IDNP0uUQahqJbSfDf2yjQ+vXCEkN9zW3h+N2T6RKIwjN
|
927
|
+
EdtMO8dZ+lWdMDGCAawwggGoAgEBMFIwTTELMAkGA1UEBhMCSlAxETAPBgNVBAoM
|
941
928
|
CGN0b3Iub3JnMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEVMBMGA1UEAwwMaHR0cC1h
|
942
|
-
|
943
|
-
|
944
|
-
|
929
|
+
Y2Nlc3MyAgEBMAkGBSsOAwIaBQCggbEwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEH
|
930
|
+
ATAcBgkqhkiG9w0BCQUxDxcNMDcwOTExMTQwNjUwWjAjBgkqhkiG9w0BCQQxFgQU
|
931
|
+
LDo4zNjnYqZsbuf5cQiMPYoKaq4wUgYJKoZIhvcNAQkPMUUwQzAKBggqhkiG9w0D
|
945
932
|
BzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZI
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
933
|
+
hvcNAwICASgwDQYJKoZIhvcNAQEBBQAEgYBATRqB7vtE7yjSfNYaV6urEPN9ewKx
|
934
|
+
VS7lZVuCWjbC7Yt2XIRMLWq+CgPy+FNfCGH6DIDzN6HnfsRuCSB25mTtInTopJAb
|
935
|
+
hG5SpJ1GScCjmVoJIGXvXDejKQPo9rz2WK0ZEj7NRtpNyfv0BwG+bRozgq54Cnq/
|
936
|
+
yNXneHi9dCn1KQ==
|
950
937
|
|
951
|
-
------
|
938
|
+
------8B5C3F7F4B46AC7A36EDE5247D3D6E76--
|
952
939
|
|
data/lib/httpclient/http.rb
CHANGED
@@ -196,14 +196,16 @@ class Message
|
|
196
196
|
|
197
197
|
def dump(dev = '')
|
198
198
|
set_header
|
199
|
+
str = nil
|
199
200
|
if @is_request
|
200
|
-
|
201
|
+
str = request_line
|
201
202
|
else
|
202
|
-
|
203
|
+
str = response_status_line
|
203
204
|
end
|
204
|
-
|
205
|
+
str += @header_item.collect { |key, value|
|
205
206
|
dump_line("#{ key }: #{ value }")
|
206
207
|
}.join
|
208
|
+
dev << str
|
207
209
|
dev
|
208
210
|
end
|
209
211
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: httpclient
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 2.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 2.1.2
|
7
|
+
date: 2007-09-22 00:00:00 +09:00
|
8
8
|
summary: gives something like the functionality of libwww-perl (LWP) in Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|