|
@@ -18,9 +18,9 @@ namespace {
|
|
|
std::string ResourceTypeToString(content::ResourceType type) {
|
|
|
switch (type) {
|
|
|
case content::RESOURCE_TYPE_MAIN_FRAME:
|
|
|
- return "main_frame";
|
|
|
+ return "mainFrame";
|
|
|
case content::RESOURCE_TYPE_SUB_FRAME:
|
|
|
- return "sub_frame";
|
|
|
+ return "subFrame";
|
|
|
case content::RESOURCE_TYPE_STYLESHEET:
|
|
|
return "stylesheet";
|
|
|
case content::RESOURCE_TYPE_SCRIPT:
|
|
@@ -30,12 +30,18 @@ std::string ResourceTypeToString(content::ResourceType type) {
|
|
|
case content::RESOURCE_TYPE_OBJECT:
|
|
|
return "object";
|
|
|
case content::RESOURCE_TYPE_XHR:
|
|
|
- return "xmlhttprequest";
|
|
|
+ return "xhr";
|
|
|
default:
|
|
|
return "other";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+AtomNetworkDelegate::BlockingResponse RunListener(
|
|
|
+ const AtomNetworkDelegate::Listener& callback,
|
|
|
+ scoped_ptr<base::DictionaryValue> details) {
|
|
|
+ return callback.Run(*(details.get()));
|
|
|
+}
|
|
|
+
|
|
|
bool MatchesFilterCondition(
|
|
|
net::URLRequest* request,
|
|
|
const AtomNetworkDelegate::ListenerInfo& info) {
|
|
@@ -50,8 +56,8 @@ bool MatchesFilterCondition(
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-base::DictionaryValue* ExtractRequestInfo(net::URLRequest* request) {
|
|
|
- base::DictionaryValue* dict = new base::DictionaryValue();
|
|
|
+scoped_ptr<base::DictionaryValue> ExtractRequestInfo(net::URLRequest* request) {
|
|
|
+ scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
|
|
|
dict->SetInteger("id", request->identifier());
|
|
|
dict->SetString("url", request->url().spec());
|
|
|
dict->SetString("method", request->method());
|
|
@@ -62,21 +68,21 @@ base::DictionaryValue* ExtractRequestInfo(net::URLRequest* request) {
|
|
|
dict->SetString("resourceType", ResourceTypeToString(resourceType));
|
|
|
dict->SetDouble("timestamp", base::Time::Now().ToDoubleT() * 1000);
|
|
|
|
|
|
- return dict;
|
|
|
+ return dict.Pass();
|
|
|
}
|
|
|
|
|
|
-base::DictionaryValue* GetRequestHeadersDict(
|
|
|
+scoped_ptr<base::DictionaryValue> GetRequestHeadersDict(
|
|
|
const net::HttpRequestHeaders& headers) {
|
|
|
- base::DictionaryValue* header_dict = new base::DictionaryValue();
|
|
|
+ scoped_ptr<base::DictionaryValue> header_dict(new base::DictionaryValue());
|
|
|
net::HttpRequestHeaders::Iterator it(headers);
|
|
|
while (it.GetNext())
|
|
|
header_dict->SetString(it.name(), it.value());
|
|
|
- return header_dict;
|
|
|
+ return header_dict.Pass();
|
|
|
}
|
|
|
|
|
|
-base::DictionaryValue* GetResponseHeadersDict(
|
|
|
+scoped_ptr<base::DictionaryValue> GetResponseHeadersDict(
|
|
|
const net::HttpResponseHeaders* headers) {
|
|
|
- base::DictionaryValue* header_dict = new base::DictionaryValue();
|
|
|
+ scoped_ptr<base::DictionaryValue> header_dict(new base::DictionaryValue());
|
|
|
if (headers) {
|
|
|
void* iter = nullptr;
|
|
|
std::string key;
|
|
@@ -84,25 +90,25 @@ base::DictionaryValue* GetResponseHeadersDict(
|
|
|
while (headers->EnumerateHeaderLines(&iter, &key, &value))
|
|
|
header_dict->SetString(key, value);
|
|
|
}
|
|
|
- return header_dict;
|
|
|
+ return header_dict.Pass();
|
|
|
}
|
|
|
|
|
|
void OnBeforeURLRequestResponse(
|
|
|
const net::CompletionCallback& callback,
|
|
|
GURL* new_url,
|
|
|
const AtomNetworkDelegate::BlockingResponse& result) {
|
|
|
- if (!result.redirectURL.is_empty())
|
|
|
- *new_url = result.redirectURL;
|
|
|
- callback.Run(result.Cancel());
|
|
|
+ if (!result.redirect_url.is_empty())
|
|
|
+ *new_url = result.redirect_url;
|
|
|
+ callback.Run(result.Code());
|
|
|
}
|
|
|
|
|
|
void OnBeforeSendHeadersResponse(
|
|
|
const net::CompletionCallback& callback,
|
|
|
net::HttpRequestHeaders* headers,
|
|
|
const AtomNetworkDelegate::BlockingResponse& result) {
|
|
|
- if (!result.requestHeaders.IsEmpty())
|
|
|
- *headers = result.requestHeaders;
|
|
|
- callback.Run(result.Cancel());
|
|
|
+ if (!result.request_headers.IsEmpty())
|
|
|
+ *headers = result.request_headers;
|
|
|
+ callback.Run(result.Code());
|
|
|
}
|
|
|
|
|
|
void OnHeadersReceivedResponse(
|
|
@@ -110,26 +116,22 @@ void OnHeadersReceivedResponse(
|
|
|
const net::HttpResponseHeaders* original_response_headers,
|
|
|
scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
|
|
|
const AtomNetworkDelegate::BlockingResponse& result) {
|
|
|
- if (result.responseHeaders.get()) {
|
|
|
+ if (result.response_headers.get()) {
|
|
|
*override_response_headers = new net::HttpResponseHeaders(
|
|
|
original_response_headers->raw_headers());
|
|
|
void* iter = nullptr;
|
|
|
std::string key;
|
|
|
std::string value;
|
|
|
- while (result.responseHeaders->EnumerateHeaderLines(&iter, &key, &value)) {
|
|
|
+ while (result.response_headers->EnumerateHeaderLines(&iter, &key, &value)) {
|
|
|
(*override_response_headers)->RemoveHeader(key);
|
|
|
(*override_response_headers)->AddHeader(key + ": " + value);
|
|
|
}
|
|
|
}
|
|
|
- callback.Run(result.Cancel());
|
|
|
+ callback.Run(result.Code());
|
|
|
}
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
-// static
|
|
|
-std::map<AtomNetworkDelegate::EventTypes, AtomNetworkDelegate::ListenerInfo>
|
|
|
-AtomNetworkDelegate::event_listener_map_;
|
|
|
-
|
|
|
AtomNetworkDelegate::AtomNetworkDelegate() {
|
|
|
}
|
|
|
|
|
@@ -138,8 +140,13 @@ AtomNetworkDelegate::~AtomNetworkDelegate() {
|
|
|
|
|
|
void AtomNetworkDelegate::SetListenerInIO(
|
|
|
EventTypes type,
|
|
|
- const base::DictionaryValue* filter,
|
|
|
+ scoped_ptr<base::DictionaryValue> filter,
|
|
|
const Listener& callback) {
|
|
|
+ if (callback.is_null()) {
|
|
|
+ event_listener_map_.erase(type);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
ListenerInfo info;
|
|
|
info.callback = callback;
|
|
|
|
|
@@ -162,69 +169,71 @@ int AtomNetworkDelegate::OnBeforeURLRequest(
|
|
|
net::URLRequest* request,
|
|
|
const net::CompletionCallback& callback,
|
|
|
GURL* new_url) {
|
|
|
- brightray::NetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
|
|
|
-
|
|
|
- auto listener_info = event_listener_map_[kOnBeforeRequest];
|
|
|
+ auto listener_info = event_listener_map_.find(kOnBeforeRequest);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return net::OK;
|
|
|
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return net::OK;
|
|
|
-
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
|
|
|
BrowserThread::PostTaskAndReplyWithResult(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(wrapped_callback, details),
|
|
|
+ base::Bind(&RunListener, wrapped_callback, base::Passed(&details)),
|
|
|
base::Bind(&OnBeforeURLRequestResponse,
|
|
|
callback, new_url));
|
|
|
|
|
|
return net::ERR_IO_PENDING;
|
|
|
}
|
|
|
|
|
|
- return net::OK;
|
|
|
+ return brightray::NetworkDelegate::OnBeforeURLRequest(request,
|
|
|
+ callback,
|
|
|
+ new_url);
|
|
|
}
|
|
|
|
|
|
int AtomNetworkDelegate::OnBeforeSendHeaders(
|
|
|
net::URLRequest* request,
|
|
|
const net::CompletionCallback& callback,
|
|
|
net::HttpRequestHeaders* headers) {
|
|
|
- auto listener_info = event_listener_map_[kOnBeforeSendHeaders];
|
|
|
-
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return net::OK;
|
|
|
+ auto listener_info = event_listener_map_.find(kOnBeforeSendHeaders);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return net::OK;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
- details->Set("requestHeaders", GetRequestHeadersDict(*headers));
|
|
|
+ details->Set("requestHeaders", GetRequestHeadersDict(*headers).release());
|
|
|
|
|
|
BrowserThread::PostTaskAndReplyWithResult(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(wrapped_callback, details),
|
|
|
+ base::Bind(&RunListener, wrapped_callback, base::Passed(&details)),
|
|
|
base::Bind(&OnBeforeSendHeadersResponse,
|
|
|
callback, headers));
|
|
|
|
|
|
return net::ERR_IO_PENDING;
|
|
|
}
|
|
|
|
|
|
- return net::OK;
|
|
|
+ return brightray::NetworkDelegate::OnBeforeSendHeaders(request,
|
|
|
+ callback,
|
|
|
+ headers);
|
|
|
}
|
|
|
|
|
|
void AtomNetworkDelegate::OnSendHeaders(
|
|
|
net::URLRequest* request,
|
|
|
const net::HttpRequestHeaders& headers) {
|
|
|
- auto listener_info = event_listener_map_[kOnSendHeaders];
|
|
|
-
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return;
|
|
|
+ auto listener_info = event_listener_map_.find(kOnSendHeaders);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
- details->Set("requestHeaders", GetRequestHeadersDict(headers));
|
|
|
+ details->Set("requestHeaders", GetRequestHeadersDict(headers).release());
|
|
|
|
|
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(base::IgnoreResult(wrapped_callback),
|
|
|
- details));
|
|
|
+ base::Bind(base::IgnoreResult(&RunListener),
|
|
|
+ wrapped_callback,
|
|
|
+ base::Passed(&details)));
|
|
|
+ } else {
|
|
|
+ brightray::NetworkDelegate::OnSendHeaders(request, headers);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -234,23 +243,22 @@ int AtomNetworkDelegate::OnHeadersReceived(
|
|
|
const net::HttpResponseHeaders* original_response_headers,
|
|
|
scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
|
|
|
GURL* allowed_unsafe_redirect_url) {
|
|
|
- auto listener_info = event_listener_map_[kOnHeadersReceived];
|
|
|
-
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return net::OK;
|
|
|
+ auto listener_info = event_listener_map_.find(kOnHeadersReceived);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return net::OK;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
details->SetString("statusLine",
|
|
|
original_response_headers->GetStatusLine());
|
|
|
details->SetInteger("statusCode",
|
|
|
original_response_headers->response_code());
|
|
|
details->Set("responseHeaders",
|
|
|
- GetResponseHeadersDict(original_response_headers));
|
|
|
+ GetResponseHeadersDict(original_response_headers).release());
|
|
|
|
|
|
BrowserThread::PostTaskAndReplyWithResult(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(wrapped_callback, details),
|
|
|
+ base::Bind(&RunListener, wrapped_callback, base::Passed(&details)),
|
|
|
base::Bind(&OnHeadersReceivedResponse,
|
|
|
callback,
|
|
|
original_response_headers,
|
|
@@ -259,18 +267,19 @@ int AtomNetworkDelegate::OnHeadersReceived(
|
|
|
return net::ERR_IO_PENDING;
|
|
|
}
|
|
|
|
|
|
- return net::OK;
|
|
|
+ return brightray::NetworkDelegate::OnHeadersReceived(
|
|
|
+ request, callback, original_response_headers, override_response_headers,
|
|
|
+ allowed_unsafe_redirect_url);
|
|
|
}
|
|
|
|
|
|
void AtomNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
|
|
|
const GURL& new_location) {
|
|
|
- auto listener_info = event_listener_map_[kOnBeforeRedirect];
|
|
|
-
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return;
|
|
|
+ auto listener_info = event_listener_map_.find(kOnBeforeRedirect);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
details->SetString("redirectURL", new_location.spec());
|
|
|
details->SetInteger("statusCode", request->GetResponseCode());
|
|
@@ -279,28 +288,30 @@ void AtomNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
|
|
|
details->SetString("ip", ip);
|
|
|
details->SetBoolean("fromCache", request->was_cached());
|
|
|
details->Set("responseHeaders",
|
|
|
- GetResponseHeadersDict(request->response_headers()));
|
|
|
+ GetResponseHeadersDict(request->response_headers()).release());
|
|
|
|
|
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(base::IgnoreResult(wrapped_callback),
|
|
|
- details));
|
|
|
+ base::Bind(base::IgnoreResult(&RunListener),
|
|
|
+ wrapped_callback,
|
|
|
+ base::Passed(&details)));
|
|
|
+ } else {
|
|
|
+ brightray::NetworkDelegate::OnBeforeRedirect(request, new_location);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void AtomNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
|
|
|
- if (request->status().status() != net::URLRequestStatus::SUCCESS)
|
|
|
- return;
|
|
|
-
|
|
|
- auto listener_info = event_listener_map_[kOnResponseStarted];
|
|
|
+ auto listener_info = event_listener_map_.find(kOnResponseStarted);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (request->status().status() != net::URLRequestStatus::SUCCESS)
|
|
|
+ return;
|
|
|
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return;
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
details->Set("responseHeaders",
|
|
|
- GetResponseHeadersDict(request->response_headers()));
|
|
|
+ GetResponseHeadersDict(request->response_headers()).release());
|
|
|
details->SetBoolean("fromCache", request->was_cached());
|
|
|
|
|
|
auto response_headers = request->response_headers();
|
|
@@ -312,34 +323,36 @@ void AtomNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
|
|
|
response_headers->GetStatusLine() : std::string());
|
|
|
|
|
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(base::IgnoreResult(wrapped_callback),
|
|
|
- details));
|
|
|
+ base::Bind(base::IgnoreResult(&RunListener),
|
|
|
+ wrapped_callback,
|
|
|
+ base::Passed(&details)));
|
|
|
+ } else {
|
|
|
+ brightray::NetworkDelegate::OnResponseStarted(request);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
|
|
|
- if (request->status().status() == net::URLRequestStatus::FAILED ||
|
|
|
- request->status().status() == net::URLRequestStatus::CANCELED) {
|
|
|
- OnErrorOccurred(request);
|
|
|
- return;
|
|
|
- } else {
|
|
|
- bool is_redirect = request->response_headers() &&
|
|
|
- net::HttpResponseHeaders::IsRedirectResponseCode(
|
|
|
- request->response_headers()->response_code());
|
|
|
- if (is_redirect)
|
|
|
+ auto listener_info = event_listener_map_.find(kOnCompleted);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (request->status().status() == net::URLRequestStatus::FAILED ||
|
|
|
+ request->status().status() == net::URLRequestStatus::CANCELED) {
|
|
|
+ OnErrorOccurred(request);
|
|
|
return;
|
|
|
- }
|
|
|
-
|
|
|
- auto listener_info = event_listener_map_[kOnCompleted];
|
|
|
+ } else {
|
|
|
+ bool is_redirect = request->response_headers() &&
|
|
|
+ net::HttpResponseHeaders::IsRedirectResponseCode(
|
|
|
+ request->response_headers()->response_code());
|
|
|
+ if (is_redirect)
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return;
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
details->Set("responseHeaders",
|
|
|
- GetResponseHeadersDict(request->response_headers()));
|
|
|
+ GetResponseHeadersDict(request->response_headers()).release());
|
|
|
details->SetBoolean("fromCache", request->was_cached());
|
|
|
|
|
|
auto response_headers = request->response_headers();
|
|
@@ -351,26 +364,29 @@ void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
|
|
|
response_headers->GetStatusLine() : std::string());
|
|
|
|
|
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(base::IgnoreResult(wrapped_callback),
|
|
|
- details));
|
|
|
+ base::Bind(base::IgnoreResult(&RunListener),
|
|
|
+ wrapped_callback,
|
|
|
+ base::Passed(&details)));
|
|
|
+ } else {
|
|
|
+ brightray::NetworkDelegate::OnCompleted(request, started);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void AtomNetworkDelegate::OnErrorOccurred(net::URLRequest* request) {
|
|
|
- auto listener_info = event_listener_map_[kOnErrorOccurred];
|
|
|
-
|
|
|
- if (!MatchesFilterCondition(request, listener_info))
|
|
|
- return;
|
|
|
+ auto listener_info = event_listener_map_.find(kOnErrorOccurred);
|
|
|
+ if (listener_info != event_listener_map_.end()) {
|
|
|
+ if (!MatchesFilterCondition(request, listener_info->second))
|
|
|
+ return;
|
|
|
|
|
|
- if (!listener_info.callback.is_null()) {
|
|
|
- auto wrapped_callback = listener_info.callback;
|
|
|
+ auto wrapped_callback = listener_info->second.callback;
|
|
|
auto details = ExtractRequestInfo(request);
|
|
|
details->SetBoolean("fromCache", request->was_cached());
|
|
|
details->SetString("error", net::ErrorToString(request->status().error()));
|
|
|
|
|
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
|
|
- base::Bind(base::IgnoreResult(wrapped_callback),
|
|
|
- details));
|
|
|
+ base::Bind(base::IgnoreResult(&RunListener),
|
|
|
+ wrapped_callback,
|
|
|
+ base::Passed(&details)));
|
|
|
}
|
|
|
}
|
|
|
|