1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
=begin
= https.rb -- SSL/TLS enhancement for Net::HTTP.
Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
This program requires Net 1.2.0 or higher version.
You can get it from RAA or Ruby's CVS repository.
$IPR: https.rb,v 1.5 2001/07/15 22:24:05 gotoyuzo Exp $
2001/11/06: Contiributed to Ruby/OpenSSL project.
$Id$
== class Net::HTTP
== Example
Simple HTTP client is here:
require 'net/http'
host, port, path = "localhost", 80, "/"
if %r!http://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0]
host = $1
port = $2.to_i if $2
path = $3
end
h = Net::HTTP.new(host, port)
h.get2(path){ |resp| print resp.body }
It can be replaced by follow one:
require 'net/https'
host, port, path = "localhost", 80, "/"
if %r!(https?)://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0]
scheme = $1
host = $2
port = $3 ? $3.to_i : ((scheme == "http") ? 80 : 443)
path = $4
end
h = Net::HTTP.new(host, port)
h.use_ssl = true if scheme == "https" # enable SSL/TLS
h.get2(path){ |resp| print resp.body }
=== Instance Methods
: use_ssl
returns ture if use SSL/TLS with HTTP.
: use_ssl=((|true_or_false|))
sets use_ssl.
: peer_cert
return the X.509 certificates the server presented.
: key=((|key|))
Sets an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object.
(This method is appeared in Michal Rokos's OpenSSL extention.)
: key_file=((|path|))
Sets a private key file to use in PEM format.
: cert=((|cert|))
Sets an OpenSSL::X509::Certificate object as client certificate.
(This method is appeared in Michal Rokos's OpenSSL extention.)
: cert_file=((|path|))
Sets pathname of a X.509 certification file in PEM format.
: ca_cert=((|cert|))
Sets an OpenSSL::X509::Certificate object as specific CA certifacate.
(This method is appeared in Michal Rokos's OpenSSL extention.)
: ca_file=((|path|))
Sets path of a CA certification file in PEM format.
The file can contrain several CA certificats.
: ca_path=((|path|))
Sets path of a CA certification directory containing certifications
in PEM format.
: verify_mode=((|mode|))
Sets the flags for server the certification verification at
begining of SSL/TLS session.
: verify_callback=((|proc|))
Sets the verify callback for the server certification verification.
: verify_depth=((|num|))
Sets the maximum depth for the certificate chain verification.
=end
require 'net/protocols'
require 'net/http'
module Net
class HTTP
protocol_param :socket_type, ::Net::NetPrivate::SSLSocket
attr_accessor :use_ssl
attr_writer :key, :cert, :key_file, :cert_file
attr_writer :ca_file, :ca_path, :timeout
attr_writer :verify_mode, :verify_callback, :verify_depth
attr_reader :peer_cert
class Conn < ::Net::NetPrivate::HTTPRequest
REQUEST_HAS_BODY=false
RESPONSE_HAS_BODY=false
METHOD="connect"
def initialize
super nil, nil
end
def exec( sock, addr, port, ver )
@socket = sock
request addr, port, ver
@response = get_response(sock)
@response
end
def request( addr, port, ver )
@socket.writeline sprintf('CONNECT %s:%s HTTP/%s', addr, port, ver)
@socket.writeline ''
end
end
def on_connect
if use_ssl
if proxy?
resp = Conn.new.exec(@socket, @address, @port, "1.0")
if resp.code != '200'
raise resp.message
end
end
@socket.key = @key if @key
@socket.key_file = @key_file if @key_file
@socket.cert = @cert if @cert
@socket.cert_file = @cert_file if @cert_file
@socket.ca_file = @ca_file
@socket.ca_path = @ca_path
@socket.verify_mode = @verify_mode
@socket.verify_callback = @verify_callback
@socket.verify_depth = @verify_depth
@socket.timeout = @timeout
@socket.ssl_connect
@peer_cert = socket.peer_cert
end
end
module ProxyMod
def edit_path( path )
if use_ssl
'https://' + addr_port + path
else
'http://' + addr_port + path
end
end
end
end
end
|