2008-02-29 Mark Rowe <mrowe@apple.com>
[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
31 #import "FormDataStreamMac.h"
32
33 #import <Foundation/Foundation.h>
34
35 namespace WebCore {
36
37 NSURLRequest* ResourceRequest::nsURLRequest() const
38
39     updatePlatformRequest();
40     
41     return [[m_nsRequest.get() retain] autorelease]; 
42 }
43
44 void ResourceRequest::doUpdateResourceRequest()
45 {
46     m_url = [m_nsRequest.get() URL];
47     m_cachePolicy = (ResourceRequestCachePolicy)[m_nsRequest.get() cachePolicy];
48     m_timeoutInterval = [m_nsRequest.get() timeoutInterval];
49     m_mainDocumentURL = [m_nsRequest.get() mainDocumentURL];
50     
51     if (NSString* method = [m_nsRequest.get() HTTPMethod])
52         m_httpMethod = method;
53     m_allowHTTPCookies = [m_nsRequest.get() HTTPShouldHandleCookies];
54     
55     NSDictionary *headers = [m_nsRequest.get() allHTTPHeaderFields];
56     NSEnumerator *e = [headers keyEnumerator];
57     NSString *name;
58     while ((name = [e nextObject]))
59         m_httpHeaderFields.set(name, [headers objectForKey:name]);
60     
61     if (NSData* bodyData = [m_nsRequest.get() HTTPBody])
62         m_httpBody = FormData::create([bodyData bytes], [bodyData length]);
63     else if (NSInputStream* bodyStream = [m_nsRequest.get() HTTPBodyStream])
64         if (FormData* formData = httpBodyFromStream(bodyStream))
65             m_httpBody = formData;    
66 }
67
68 void ResourceRequest::doUpdatePlatformRequest()
69 {
70     if (isNull()) {
71         m_nsRequest = nil;
72         return;
73     }
74     
75     NSMutableURLRequest* nsRequest = [m_nsRequest.get() mutableCopy];
76
77     if (nsRequest)
78         [nsRequest setURL:url()];
79     else
80         nsRequest = [[NSMutableURLRequest alloc] initWithURL:url()];
81
82 #ifdef BUILDING_ON_TIGER
83     wkSupportsMultipartXMixedReplace(nsRequest);
84 #endif
85
86     [nsRequest setCachePolicy:(NSURLRequestCachePolicy)cachePolicy()];
87     [nsRequest setTimeoutInterval:timeoutInterval()];
88     [nsRequest setMainDocumentURL:mainDocumentURL()];
89     if (!httpMethod().isEmpty())
90         [nsRequest setHTTPMethod:httpMethod()];
91     [nsRequest setHTTPShouldHandleCookies:allowHTTPCookies()];
92     
93     HTTPHeaderMap::const_iterator end = httpHeaderFields().end();
94     for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != end; ++it)
95         [nsRequest setValue:it->second forHTTPHeaderField:it->first];
96     
97     RefPtr<FormData> formData = httpBody();
98     if (formData && !formData->isEmpty())
99         WebCore::setHTTPBody(nsRequest, formData);
100     
101     m_nsRequest.adoptNS(nsRequest);
102 }
103
104 }