| Class | SOAP::HTTPStreamHandler |
| In: |
lib/soap/streamHandler.rb
|
| Parent: | StreamHandler |
| Client | = | HTTPAccess2::Client |
| RETRYABLE | = | true |
| Client | = | SOAP::NetHttpClient |
| RETRYABLE | = | false |
| MAX_RETRY_COUNT | = | 10 |
| client | [R] | |
| wiredump_file_base | [RW] |
# File lib/soap/streamHandler.rb, line 83
83: def initialize(options)
84: super()
85: @client = Client.new(nil, "SOAP4R/#{ Version }")
86: @wiredump_file_base = nil
87: @charset = @wiredump_dev = nil
88: @options = options
89: set_options
90: @client.debug_dev = @wiredump_dev
91: @cookie_store = nil
92: @accept_encoding_gzip = false
93: end
# File lib/soap/streamHandler.rb, line 99
99: def accept_encoding_gzip=(allow)
100: @accept_encoding_gzip = allow
101: end
# File lib/soap/streamHandler.rb, line 112
112: def reset(endpoint_url = nil)
113: if endpoint_url.nil?
114: @client.reset_all
115: else
116: @client.reset(endpoint_url)
117: end
118: @client.save_cookie_store if @cookie_store
119: end
# File lib/soap/streamHandler.rb, line 107
107: def send(endpoint_url, conn_data, soapaction = nil, charset = @charset)
108: conn_data.soapaction ||= soapaction # for backward conpatibility
109: send_post(endpoint_url, conn_data, charset)
110: end
# File lib/soap/streamHandler.rb, line 95
95: def test_loopback_response
96: @client.test_loopback_response
97: end
# File lib/soap/streamHandler.rb, line 215
215: def decode_gzip(instring)
216: unless send_accept_encoding_gzip?
217: raise HTTPStreamError.new("Gzipped response content.")
218: end
219: begin
220: gz = Zlib::GzipReader.new(StringIO.new(instring))
221: gz.read
222: ensure
223: gz.close
224: end
225: end
# File lib/soap/streamHandler.rb, line 211
211: def send_accept_encoding_gzip?
212: @accept_encoding_gzip and defined?(::Zlib)
213: end
# File lib/soap/streamHandler.rb, line 151
151: def send_post(endpoint_url, conn_data, charset)
152: conn_data.send_contenttype ||= StreamHandler.create_media_type(charset)
153:
154: if @wiredump_file_base
155: filename = @wiredump_file_base + '_request.xml'
156: f = File.open(filename, "w")
157: f << conn_data.send_string
158: f.close
159: end
160:
161: extra = {}
162: extra['Content-Type'] = conn_data.send_contenttype
163: extra['SOAPAction'] = "\"#{ conn_data.soapaction }\""
164: extra['Accept-Encoding'] = 'gzip' if send_accept_encoding_gzip?
165: send_string = conn_data.send_string
166: @wiredump_dev << "Wire dump:\n\n" if @wiredump_dev
167: begin
168: retry_count = 0
169: while true
170: res = @client.post(endpoint_url, send_string, extra)
171: if RETRYABLE and HTTP::Status.redirect?(res.status)
172: retry_count += 1
173: if retry_count >= MAX_RETRY_COUNT
174: raise HTTPStreamError.new("redirect count exceeded")
175: end
176: endpoint_url = res.header["location"][0]
177: puts "redirected to #{endpoint_url}" if $DEBUG
178: else
179: break
180: end
181: end
182: rescue
183: @client.reset(endpoint_url)
184: raise
185: end
186: @wiredump_dev << "\n\n" if @wiredump_dev
187: receive_string = res.content
188: if @wiredump_file_base
189: filename = @wiredump_file_base + '_response.xml'
190: f = File.open(filename, "w")
191: f << receive_string
192: f.close
193: end
194: case res.status
195: when 405
196: raise PostUnavailableError.new("#{ res.status }: #{ res.reason }")
197: when 200, 500
198: # Nothing to do.
199: else
200: raise HTTPStreamError.new("#{ res.status }: #{ res.reason }")
201: end
202: if res.respond_to?(:header) and !res.header['content-encoding'].empty? and
203: res.header['content-encoding'][0].downcase == 'gzip'
204: receive_string = decode_gzip(receive_string)
205: end
206: conn_data.receive_string = receive_string
207: conn_data.receive_contenttype = res.contenttype
208: conn_data
209: end
# File lib/soap/streamHandler.rb, line 145
145: def set_cookie_store_file(value)
146: value = nil if value and value.empty?
147: @cookie_store = value
148: @client.set_cookie_store(@cookie_store) if @cookie_store
149: end
# File lib/soap/streamHandler.rb, line 123
123: def set_options
124: HTTPConfigLoader.set_options(@client, @options)
125: @charset = @options["charset"] || XSD::Charset.xml_encoding_label
126: @options.add_hook("charset") do |key, value|
127: @charset = value
128: end
129: @wiredump_dev = @options["wiredump_dev"]
130: @options.add_hook("wiredump_dev") do |key, value|
131: @wiredump_dev = value
132: @client.debug_dev = @wiredump_dev
133: end
134: set_cookie_store_file(@options["cookie_store_file"])
135: @options.add_hook("cookie_store_file") do |key, value|
136: set_cookie_store_file(value)
137: end
138: ssl_config = @options["ssl_config"]
139: basic_auth = @options["basic_auth"]
140: @options.lock(true)
141: ssl_config.unlock
142: basic_auth.unlock
143: end