| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/debugger/devtools_netlog_observer.h" |
| 6 |
| 7 #include "base/string_util.h" |
| 8 #include "chrome/browser/io_thread.h" |
| 9 #include "chrome/common/resource_response.h" |
| 10 #include "net/base/load_flags.h" |
| 11 #include "net/http/http_net_log_params.h" |
| 12 #include "net/url_request/url_request_netlog_params.h" |
| 13 #include "webkit/glue/resource_loader_bridge.h" |
| 14 |
| 15 const size_t kMaxNumEntries = 1000; |
| 16 |
| 17 DevToolsNetLogObserver* DevToolsNetLogObserver::instance_ = NULL; |
| 18 |
| 19 DevToolsNetLogObserver::DevToolsNetLogObserver(ChromeNetLog* chrome_net_log) |
| 20 : ChromeNetLog::Observer(net::NetLog::LOG_ALL), |
| 21 chrome_net_log_(chrome_net_log) { |
| 22 chrome_net_log_->AddObserver(this); |
| 23 } |
| 24 |
| 25 DevToolsNetLogObserver::~DevToolsNetLogObserver() { |
| 26 chrome_net_log_->RemoveObserver(this); |
| 27 } |
| 28 |
| 29 DevToolsNetLogObserver::ResourceInfo* |
| 30 DevToolsNetLogObserver::GetResourceInfo(uint32 id) { |
| 31 RequestToInfoMap::iterator it = request_to_info_.find(id); |
| 32 if (it != request_to_info_.end()) |
| 33 return it->second; |
| 34 return NULL; |
| 35 } |
| 36 |
| 37 void DevToolsNetLogObserver::OnAddEntry(net::NetLog::EventType type, |
| 38 const base::TimeTicks& time, |
| 39 const net::NetLog::Source& source, |
| 40 net::NetLog::EventPhase phase, |
| 41 net::NetLog::EventParameters* params) { |
| 42 if (type == net::NetLog::TYPE_URL_REQUEST_START_JOB) { |
| 43 if (phase != net::NetLog::PHASE_BEGIN) |
| 44 return; |
| 45 int load_flags = static_cast<URLRequestStartEventParameters*>(params)-> |
| 46 load_flags(); |
| 47 if (!(load_flags & net::LOAD_REPORT_RAW_HEADERS)) |
| 48 return; |
| 49 if (request_to_info_.size() > kMaxNumEntries) { |
| 50 LOG(WARNING) << "The raw headers observer url request count has grown " |
| 51 "larger than expected, resetting"; |
| 52 request_to_info_.clear(); |
| 53 } |
| 54 scoped_refptr<ResourceInfo> new_record = new ResourceInfo(); |
| 55 request_to_info_.insert(std::make_pair(source.id, new_record)); |
| 56 return; |
| 57 } |
| 58 if (type == net::NetLog::TYPE_REQUEST_ALIVE && |
| 59 phase == net::NetLog::PHASE_END) { |
| 60 request_to_info_.erase(source.id); |
| 61 return; |
| 62 } |
| 63 if (type != net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS && |
| 64 type != net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS) |
| 65 return; |
| 66 |
| 67 ResourceInfo* info = GetResourceInfo(source.id); |
| 68 if (!info) |
| 69 return; |
| 70 |
| 71 switch (type) { |
| 72 case net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS: { |
| 73 const net::HttpRequestHeaders &request_headers = |
| 74 static_cast<net::NetLogHttpRequestParameter*>(params)->GetHeaders(); |
| 75 for (net::HttpRequestHeaders::Iterator it(request_headers); |
| 76 it.GetNext();) { |
| 77 info->request_headers.push_back(std::make_pair(it.name(), |
| 78 it.value())); |
| 79 } |
| 80 break; |
| 81 } |
| 82 case net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS: { |
| 83 const net::HttpResponseHeaders& response_headers = |
| 84 static_cast<net::NetLogHttpResponseParameter*>(params)->GetHeaders(); |
| 85 std::string name, value; |
| 86 for (void* it = NULL; |
| 87 response_headers.EnumerateHeaderLines(&it, &name, &value); ) { |
| 88 info->response_headers.push_back(std::make_pair(name, value)); |
| 89 } |
| 90 break; |
| 91 } |
| 92 default: |
| 93 break; |
| 94 } |
| 95 } |
| 96 |
| 97 void DevToolsNetLogObserver::Attach(IOThread* io_thread) { |
| 98 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 99 DCHECK(!instance_); |
| 100 |
| 101 instance_ = new DevToolsNetLogObserver(io_thread->globals()->net_log.get()); |
| 102 } |
| 103 |
| 104 void DevToolsNetLogObserver::Detach() { |
| 105 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 106 DCHECK(instance_); |
| 107 |
| 108 delete instance_; |
| 109 instance_ = NULL; |
| 110 } |
| 111 |
| 112 DevToolsNetLogObserver* DevToolsNetLogObserver::GetInstance() { |
| 113 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 114 |
| 115 return instance_; |
| 116 } |
| 117 |
| 118 // static |
| 119 void DevToolsNetLogObserver::PopulateResponseInfo(URLRequest* request, |
| 120 ResourceResponse* response) { |
| 121 if (!(request->load_flags() & net::LOAD_REPORT_RAW_HEADERS)) |
| 122 return; |
| 123 |
| 124 uint32 source_id = request->net_log().source().id; |
| 125 DevToolsNetLogObserver* dev_tools_net_log_observer = |
| 126 DevToolsNetLogObserver::GetInstance(); |
| 127 DCHECK(dev_tools_net_log_observer); |
| 128 if (!dev_tools_net_log_observer) |
| 129 return; |
| 130 response->response_head.devtools_info = |
| 131 dev_tools_net_log_observer->GetResourceInfo(source_id); |
| 132 } |
| OLD | NEW |