}
// Overloaded by multiple types to fill the |details| object.
-void FillDetailsObject(base::DictionaryValue* details,
- net::URLRequest* request) {
+void ToDictionary(base::DictionaryValue* details, net::URLRequest* request) {
details->SetInteger("id", request->identifier());
details->SetString("url", request->url().spec());
details->SetString("method", request->method());
: "other");
}
-void FillDetailsObject(base::DictionaryValue* details,
- const net::HttpRequestHeaders& headers) {
+void ToDictionary(base::DictionaryValue* details,
+ const net::HttpRequestHeaders& headers) {
scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
net::HttpRequestHeaders::Iterator it(headers);
while (it.GetNext())
details->Set("requestHeaders", dict.Pass());
}
-void FillDetailsObject(base::DictionaryValue* details,
- const net::HttpResponseHeaders* headers) {
+void ToDictionary(base::DictionaryValue* details,
+ const net::HttpResponseHeaders* headers) {
if (!headers)
return;
details->SetInteger("statusCode", headers->response_code());
}
-void FillDetailsObject(base::DictionaryValue* details, const GURL& location) {
+void ToDictionary(base::DictionaryValue* details, const GURL& location) {
details->SetString("redirectURL", location.spec());
}
-void FillDetailsObject(base::DictionaryValue* details,
- const net::HostPortPair& host_port) {
+void ToDictionary(base::DictionaryValue* details,
+ const net::HostPortPair& host_port) {
if (host_port.host().empty())
details->SetString("ip", host_port.host());
}
-void FillDetailsObject(base::DictionaryValue* details, bool from_cache) {
+void ToDictionary(base::DictionaryValue* details, bool from_cache) {
details->SetBoolean("fromCache", from_cache);
}
-void FillDetailsObject(base::DictionaryValue* details,
- const net::URLRequestStatus& status) {
+void ToDictionary(base::DictionaryValue* details,
+ const net::URLRequestStatus& status) {
details->SetString("error", net::ErrorToString(status.error()));
}
+// Helper function to fill |details| with arbitrary |args|.
+template<typename Arg>
+void FillDetailsObject(base::DictionaryValue* details, Arg arg) {
+ ToDictionary(details, arg);
+}
+
+template<typename Arg, typename... Args>
+void FillDetailsObject(base::DictionaryValue* details, Arg arg, Args... args) {
+ ToDictionary(details, arg);
+ FillDetailsObject(details, args...);
+}
+
// Fill the native types with the result from the response object.
void ReadFromResponseObject(const base::DictionaryValue& response,
GURL* new_location) {
return net::OK;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), *headers);
+ FillDetailsObject(details.get(), request, *headers);
ResponseCallback response =
base::Bind(OnListenerResultInUI<net::HttpRequestHeaders*>,
return;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), headers);
+ FillDetailsObject(details.get(), request, headers);
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
return net::OK;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), original_response_headers);
+ FillDetailsObject(details.get(), request, original_response_headers);
ResponseCallback response =
base::Bind(OnListenerResultInUI<scoped_refptr<net::HttpResponseHeaders>*>,
return;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), new_location);
- FillDetailsObject(details.get(), request->response_headers());
- FillDetailsObject(details.get(), request->GetSocketAddress());
- FillDetailsObject(details.get(), request->was_cached());
+ FillDetailsObject(details.get(), request, new_location,
+ request->response_headers(), request->GetSocketAddress(),
+ request->was_cached());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
return;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), request->response_headers());
- FillDetailsObject(details.get(), request->was_cached());
+ FillDetailsObject(details.get(), request, request->response_headers(),
+ request->was_cached());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
return;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), request->response_headers());
- FillDetailsObject(details.get(), request->was_cached());
+ FillDetailsObject(details.get(), request, request->response_headers(),
+ request->was_cached());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
return;
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
- FillDetailsObject(details.get(), request);
- FillDetailsObject(details.get(), request->was_cached());
- FillDetailsObject(details.get(), request->status());
+ FillDetailsObject(details.get(), request, request->was_cached(),
+ request->status());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,