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
164
165
166
167
168
169
170
171
172
173
174
|
# SOAP4R - net/http wrapper
# Copyright (C) 2003 NAKAMURA, Hiroshi <[email protected]>.
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
# redistribute it and/or modify it under the same terms of Ruby's license;
# either the dual license version in 2003, or any later version.
require 'net/http'
module SOAP
class NetHttpClient
SSLEnabled = begin
require 'net/https'
true
rescue LoadError
false
end
attr_reader :proxy
attr_accessor :no_proxy
attr_accessor :debug_dev
attr_accessor :ssl_config # ignored for now.
attr_accessor :protocol_version # ignored for now.
def initialize(proxy = nil, agent = nil)
@proxy = proxy ? URI.parse(proxy) : nil
@agent = agent
@debug_dev = nil
@session_manager = SessionManager.new
@no_proxy = nil
end
def test_loopback_response
raise NotImplementedError.new("not supported for now")
end
def proxy=(proxy_str)
if proxy_str.nil?
@proxy = nil
else
@proxy = URI.parse(proxy_str)
if @proxy.scheme == nil or @proxy.scheme.downcase != 'http' or
@proxy.host == nil or @proxy.port == nil
raise ArgumentError.new("unsupported proxy `#{proxy_str}'")
end
@proxy
end
end
def set_basic_auth(uri, user_id, passwd)
# net/http does not handle url.
@basic_auth = [user_id, passwd]
end
def set_cookie_store(filename)
raise NotImplementedError.new
end
def save_cookie_store(filename)
raise NotImplementedError.new
end
def reset(url)
# no persistent connection. ignored.
end
def reset_all
# no persistent connection. ignored.
end
def post(url, req_body, header = {})
url = URI.parse(url)
extra = header.dup
extra['User-Agent'] = @agent if @agent
res = start(url) { |http|
http.post(url.request_uri, req_body, extra)
}
Response.new(res)
end
def get_content(url, header = {})
url = URI.parse(url)
extra = header.dup
extra['User-Agent'] = @agent if @agent
res = start(url) { |http|
http.get(url.request_uri, extra)
}
res.body
end
private
def start(url)
http = create_connection(url)
response = nil
http.start { |worker|
response, = yield(worker)
worker.finish
}
@debug_dev << response.body if @debug_dev
response
end
def create_connection(url)
proxy_host = proxy_port = nil
unless no_proxy?(url)
proxy_host = @proxy.host
proxy_port = @proxy.port
end
http = Net::HTTP::Proxy(proxy_host, proxy_port).new(url.host, url.port)
if http.respond_to?(:set_debug_output)
http.set_debug_output(@debug_dev)
end
case url
when URI::HTTPS
if SSLEnabled
http.use_ssl = true
else
raise RuntimeError.new("Cannot connect to #{url} (OpenSSL is not installed.)")
end
when URI::HTTP
# OK
else
raise RuntimeError.new("Cannot connect to #{url} (Not HTTP.)")
end
http
end
NO_PROXY_HOSTS = ['localhost']
def no_proxy?(uri)
if !@proxy or NO_PROXY_HOSTS.include?(uri.host)
return true
end
if @no_proxy
@no_proxy.scan(/([^:,]*)(?::(\d+))?/) do |host, port|
if /(\A|\.)#{Regexp.quote(host)}\z/i =~ uri.host &&
(!port || uri.port == port.to_i)
return true
end
end
else
false
end
end
class SessionManager
attr_accessor :connect_timeout
attr_accessor :send_timeout
attr_accessor :receive_timeout
end
class Response
attr_reader :content
attr_reader :status
attr_reader :reason
attr_reader :contenttype
def initialize(res)
@status = res.code.to_i
@reason = res.message
@contenttype = res['content-type']
@content = res.body
end
end
end
end
|