Reviewed by Darin.
[WebKit-https.git] / WebCore / platform / network / mac / ResourceRequestMac.mm
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #import "config.h"
28 #import "ResourceRequest.h"
29 #import "WebCoreSystemInterface.h"
30 #import "WebDataProtocol.h"
31
32 #import "FormDataStreamMac.h"
33
34 #import <Foundation/Foundation.h>
35
36 namespace WebCore {
37
38 NSURLRequest* ResourceRequest::nsURLRequest() const
39
40     updatePlatformRequest();
41     
42     return [[m_nsRequest.get() retain] autorelease]; 
43 }
44
45 void ResourceRequest::doUpdateResourceRequest()
46 {
47     m_url = [m_nsRequest.get() URL];
48     m_cachePolicy = (ResourceRequestCachePolicy)[m_nsRequest.get() cachePolicy];
49     m_timeoutInterval = [m_nsRequest.get() timeoutInterval];
50     m_mainDocumentURL = [m_nsRequest.get() mainDocumentURL];
51     
52     if (NSString* method = [m_nsRequest.get() HTTPMethod])
53         m_httpMethod = method;
54     m_allowHTTPCookies = [m_nsRequest.get() HTTPShouldHandleCookies];
55     
56     NSDictionary *headers = [m_nsRequest.get() allHTTPHeaderFields];
57     NSEnumerator *e = [headers keyEnumerator];
58     NSString *name;
59     while ((name = [e nextObject]))
60         m_httpHeaderFields.set(name, [headers objectForKey:name]);
61     
62     if (NSData* bodyData = [m_nsRequest.get() HTTPBody])
63         m_httpBody = new FormData([bodyData bytes], [bodyData length]);
64     else if (NSInputStream* bodyStream = [m_nsRequest.get() HTTPBodyStream])
65         if (FormData* formData = httpBodyFromStream(bodyStream))
66             m_httpBody = formData;    
67 }
68
69 void ResourceRequest::doUpdatePlatformRequest()
70 {
71     NSMutableURLRequest* nsRequest = [m_nsRequest.get() mutableCopy];
72
73     if (nsRequest)
74         [nsRequest setURL:url().getNSURL()];
75     else
76         nsRequest = [[NSMutableURLRequest alloc] initWithURL:url().getNSURL()];
77     
78     [nsRequest setCachePolicy:(NSURLRequestCachePolicy)cachePolicy()];
79     [nsRequest setTimeoutInterval:timeoutInterval()];
80     [nsRequest setMainDocumentURL:mainDocumentURL().getNSURL()];
81     if (!httpMethod().isEmpty())
82         [nsRequest setHTTPMethod:httpMethod()];
83     [nsRequest setHTTPShouldHandleCookies:allowHTTPCookies()];
84     
85     HTTPHeaderMap::const_iterator end = httpHeaderFields().end();
86     for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != end; ++it)
87         [nsRequest setValue:it->second forHTTPHeaderField:it->first];
88     
89     RefPtr<FormData> formData = httpBody();
90     if (formData && !formData->isEmpty())
91         WebCore::setHTTPBody(nsRequest, formData);
92     
93     m_nsRequest.adopt(nsRequest);
94 }
95
96 }