15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class simulates what wininet does when a dns lookup fails. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_abort_on_end_job.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPageContent[] = "some data\r\n"; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestJob* JobFactory( 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequest* request, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::NetworkDelegate* network_delegate, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& scheme) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new URLRequestAbortOnEndJob(request, network_delegate); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddUrlHandlerOnIOThread() { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter->AddUrlHandler(GURL(URLRequestAbortOnEndJob::k400AbortOnEndUrl), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &JobFactory); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // anonymous namespace 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char URLRequestAbortOnEndJob::k400AbortOnEndUrl[] = 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://url.handled.by.abort.on.end/400"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestAbortOnEndJob::AddUrlHandler() { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(AddUrlHandlerOnIOThread)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private const version. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestAbortOnEndJob::GetResponseInfoConst( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseInfo* info) const { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send back mock headers. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string raw_headers; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(k400AbortOnEndUrl, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->url().spec().c_str())) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw_headers.append( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 400 This is not OK\n" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n"); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ParseRawHeaders expects \0 to end each header line. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceSubstringsAfterOffset(&raw_headers, 0, "\n", std::string("\0", 1)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->headers = new net::HttpResponseHeaders(raw_headers); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestAbortOnEndJob::URLRequestAbortOnEndJob( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestJob(request, network_delegate), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_data_(false), 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestAbortOnEndJob::~URLRequestAbortOnEndJob() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestAbortOnEndJob::GetResponseInfo(net::HttpResponseInfo* info) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetResponseInfoConst(info); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestAbortOnEndJob::GetMimeType(std::string* mime_type) const { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseInfo info; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetResponseInfoConst(&info); 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return info.headers.get() && info.headers->GetMimeType(mime_type); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestAbortOnEndJob::StartAsync() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyHeadersComplete(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestAbortOnEndJob::Start() { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&URLRequestAbortOnEndJob::StartAsync, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestAbortOnEndJob::ReadRawData(net::IOBuffer* buf, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int max_bytes, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* bytes_read) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sent_data_) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *bytes_read = std::min(size_t(max_bytes), sizeof(kPageContent)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memcpy(buf->data(), kPageContent, *bytes_read); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_data_ = true; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetStatus(net::URLRequestStatus(net::URLRequestStatus::FAILED, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ERR_CONNECTION_ABORTED)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *bytes_read = -1; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 117