| 303 | end |
| 304 | |
| 305 | private def request_internal(http, request, &block) |
| 306 | read_timeout = http.read_timeout |
| 307 | begin |
| 308 | http.read_timeout = @current_timeout if @current_timeout |
| 309 | http.request(request) do |response| |
| 310 | case response |
| 311 | when Net::HTTPSuccess, |
| 312 | Net::HTTPNotModified |
| 313 | if block_given? |
| 314 | return yield(response) |
| 315 | else |
| 316 | response.read_body |
| 317 | return response |
| 318 | end |
| 319 | when Net::HTTPRedirection |
| 320 | redirected_url = URI(response["Location"]) |
| 321 | redirected_request = Net::HTTP::Get.new(redirected_url, {}) |
| 322 | start_http(redirected_url) do |redirected_http| |
| 323 | request_internal(redirected_http, redirected_request, &block) |
| 324 | end |
| 325 | else |
| 326 | message = "failed to request: " |
| 327 | message << "#{request.uri}: #{request.method}: " |
| 328 | message << "#{response.message} #{response.code}" |
| 329 | if response.body |
| 330 | message << "\n" |
| 331 | message << response.body |
| 332 | end |
| 333 | raise Error.new(request, response, message) |
| 334 | end |
| 335 | end |
| 336 | ensure |
| 337 | http.read_timeout = read_timeout |
| 338 | end |
| 339 | end |
| 340 | |
| 341 | def head(path) |
| 342 | url = build_read_url(path) |