Title: [202042] trunk/Source/WebCore
Revision
202042
Author
[email protected]
Date
2016-06-14 07:31:26 -0700 (Tue, 14 Jun 2016)

Log Message

[Cocoa] Avoid extra copy of headers dictionary in ResourceResponse::platformLazyInit()
https://bugs.webkit.org/show_bug.cgi?id=158717

Reviewed by Alex Christensen.

Avoid extra copy of headers dictionary in ResourceResponse::platformLazyInit() by
calling CFHTTPMessageCopyAllHeaderFields() instead of [NSURLResponse allHeaderFields].

CFHTTPMessageCopyAllHeaderFields() creates only 1 copy while
[NSURLResponse allHeaderFields] creates 2 (see <rdar://problem/26778863>).

* platform/network/cocoa/ResourceResponseCocoa.mm:
(WebCore::addToHTTPHeaderMap):
(WebCore::ResourceResponse::platformLazyInit):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (202041 => 202042)


--- trunk/Source/WebCore/ChangeLog	2016-06-14 13:10:57 UTC (rev 202041)
+++ trunk/Source/WebCore/ChangeLog	2016-06-14 14:31:26 UTC (rev 202042)
@@ -1,3 +1,20 @@
+2016-06-14  Chris Dumez  <[email protected]>
+
+        [Cocoa] Avoid extra copy of headers dictionary in ResourceResponse::platformLazyInit()
+        https://bugs.webkit.org/show_bug.cgi?id=158717
+
+        Reviewed by Alex Christensen.
+
+        Avoid extra copy of headers dictionary in ResourceResponse::platformLazyInit() by
+        calling CFHTTPMessageCopyAllHeaderFields() instead of [NSURLResponse allHeaderFields].
+
+        CFHTTPMessageCopyAllHeaderFields() creates only 1 copy while
+        [NSURLResponse allHeaderFields] creates 2 (see <rdar://problem/26778863>).
+
+        * platform/network/cocoa/ResourceResponseCocoa.mm:
+        (WebCore::addToHTTPHeaderMap):
+        (WebCore::ResourceResponse::platformLazyInit):
+
 2016-06-14  David Kilzer  <[email protected]>
 
         REGRESSION (r151608): Leak of QTMovieLayer or AVPlayerLayer in -[WebVideoFullscreenController setVideoElement:]

Modified: trunk/Source/WebCore/platform/network/cocoa/ResourceResponseCocoa.mm (202041 => 202042)


--- trunk/Source/WebCore/platform/network/cocoa/ResourceResponseCocoa.mm	2016-06-14 13:10:57 UTC (rev 202041)
+++ trunk/Source/WebCore/platform/network/cocoa/ResourceResponseCocoa.mm	2016-06-14 14:31:26 UTC (rev 202042)
@@ -159,6 +159,12 @@
     return (NSString *)CFHTTPMessageCopyResponseStatusLine(cfHTTPMessage);
 }
 
+static void addToHTTPHeaderMap(const void* key, const void* value, void* context)
+{
+    HTTPHeaderMap* httpHeaderMap = (HTTPHeaderMap*)context;
+    httpHeaderMap->set((CFStringRef)key, (CFStringRef)value);
+}
+
 void ResourceResponse::platformLazyInit(InitLevel initLevel)
 {
     if (m_initLevel >= initLevel)
@@ -187,10 +193,14 @@
             m_httpStatusCode = [httpResponse statusCode];
             
             if (initLevel < AllFields) {
-                NSDictionary *headers = [httpResponse allHeaderFields];
-                for (NSString *name : commonHeaderFields) {
-                    if (NSString* headerValue = [headers objectForKey:name])
-                        m_httpHeaderFields.set(name, headerValue);
+                CFHTTPMessageRef messageRef = CFURLResponseGetHTTPResponse([httpResponse _CFURLResponse]);
+
+                // Avoid calling [NSURLResponse allHeaderFields] to minimize copying (<rdar://problem/26778863>).
+                RetainPtr<CFDictionaryRef> headers = adoptCF(CFHTTPMessageCopyAllHeaderFields(messageRef));
+                for (auto& commonHeader : commonHeaderFields) {
+                    CFStringRef value;
+                    if (CFDictionaryGetValueIfPresent(headers.get(), commonHeader, (const void **)&value))
+                        m_httpHeaderFields.set(commonHeader, value);
                 }
             }
         } else
@@ -212,9 +222,9 @@
             CFHTTPMessageRef messageRef = CFURLResponseGetHTTPResponse([httpResponse _CFURLResponse]);
             m_httpVersion = String(adoptCF(CFHTTPMessageCopyVersion(messageRef)).get()).convertToASCIIUppercase();
 
-            NSDictionary *headers = [httpResponse allHeaderFields];
-            for (NSString *name in headers)
-                m_httpHeaderFields.set(name, [headers objectForKey:name]);
+            // Avoid calling [NSURLResponse allHeaderFields] to minimize copying (<rdar://problem/26778863>).
+            RetainPtr<CFDictionaryRef> headers = adoptCF(CFHTTPMessageCopyAllHeaderFields(messageRef));
+            CFDictionaryApplyFunction(headers.get(), addToHTTPHeaderMap, &m_httpHeaderFields);
             
             [pool drain];
         }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to