Support multiple-line headers in web-contents `did-get-response-details' event.
authorHaojian Wu <hokein.wu@gmail.com>
Fri, 5 Jun 2015 05:24:47 +0000 (13:24 +0800)
committerHaojian Wu <hokein.wu@gmail.com>
Tue, 9 Jun 2015 03:18:46 +0000 (11:18 +0800)
atom/browser/api/atom_api_web_contents.cc
atom/common/native_mate_converters/value_converter.cc
atom/common/native_mate_converters/value_converter.h

index e06d2b2..8664822 100644 (file)
@@ -345,15 +345,27 @@ void WebContents::DidGetResourceResponseStart(
   v8::Isolate* isolate = v8::Isolate::GetCurrent();
   v8::Locker locker(isolate);
   v8::HandleScope handle_scope(isolate);
-  mate::Dictionary response_headers(isolate, v8::Object::New(isolate));
+  base::DictionaryValue response_headers;
 
   net::HttpResponseHeaders* headers = details.headers.get();
+  if (!headers)
+    return;
   void* iter = nullptr;
   std::string key;
   std::string value;
-  while (headers && headers->EnumerateHeaderLines(&iter, &key, &value))
-    response_headers.Set(base::StringToLowerASCII(key),
-                         base::StringToLowerASCII(value));
+  while (headers->EnumerateHeaderLines(&iter, &key, &value)) {
+    key = base::StringToLowerASCII(key);
+    value = base::StringToLowerASCII(value);
+    if (response_headers.HasKey(key)) {
+      base::ListValue* values = nullptr;
+      if (response_headers.GetList(key, &values))
+        values->AppendString(value);
+    } else {
+      scoped_ptr<base::ListValue> values(new base::ListValue());
+      values->AppendString(value);
+      response_headers.Set(key, values.Pass());
+    }
+  }
 
   Emit("did-get-response-details",
        details.socket_address.IsEmpty(),
index 815ba0e..c9c1a86 100644 (file)
@@ -23,6 +23,13 @@ bool Converter<base::DictionaryValue>::FromV8(v8::Isolate* isolate,
   }
 }
 
+v8::Local<v8::Value> Converter<base::DictionaryValue>::ToV8(
+    v8::Isolate* isolate,
+    const base::DictionaryValue& val) {
+  scoped_ptr<atom::V8ValueConverter> converter(new atom::V8ValueConverter);
+  return converter->ToV8Value(&val, isolate->GetCurrentContext());
+}
+
 bool Converter<base::ListValue>::FromV8(v8::Isolate* isolate,
                                         v8::Local<v8::Value> val,
                                         base::ListValue* out) {
index bb0ef66..013dd99 100644 (file)
@@ -19,6 +19,8 @@ struct Converter<base::DictionaryValue> {
   static bool FromV8(v8::Isolate* isolate,
                      v8::Local<v8::Value> val,
                      base::DictionaryValue* out);
+  static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
+                                   const base::DictionaryValue& val);
 };
 
 template<>
@@ -27,7 +29,7 @@ struct Converter<base::ListValue> {
                      v8::Local<v8::Value> val,
                      base::ListValue* out);
   static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
-                                    const base::ListValue& val);
+                                   const base::ListValue& val);
 };
 
 }  // namespace mate