Home | History | Annotate | Download | only in win
      1 /*
      2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "WebKitDLL.h"
     28 #include "WebMutableURLRequest.h"
     29 
     30 #include "WebKit.h"
     31 #include "MarshallingHelpers.h"
     32 #include "WebKit.h"
     33 #include <WebCore/BString.h>
     34 #include <WebCore/COMPtr.h>
     35 #include <WebCore/FormData.h>
     36 #include <WebCore/NotImplemented.h>
     37 #include <WebCore/ResourceHandle.h>
     38 #include <wtf/text/CString.h>
     39 #include <wtf/RetainPtr.h>
     40 
     41 #if USE(CF)
     42 #include <WebCore/CertificateCFWin.h>
     43 #endif
     44 
     45 #if USE(CFNETWORK)
     46 #include <CFNetwork/CFURLRequestPriv.h>
     47 #endif
     48 
     49 using namespace WebCore;
     50 
     51 // IWebURLRequest ----------------------------------------------------------------
     52 
     53 WebMutableURLRequest::WebMutableURLRequest(bool isMutable)
     54     : m_refCount(0)
     55     , m_isMutable(isMutable)
     56 {
     57     gClassCount++;
     58     gClassNameCount.add("WebMutableURLRequest");
     59 }
     60 
     61 WebMutableURLRequest* WebMutableURLRequest::createInstance()
     62 {
     63     WebMutableURLRequest* instance = new WebMutableURLRequest(true);
     64     instance->AddRef();
     65     return instance;
     66 }
     67 
     68 WebMutableURLRequest* WebMutableURLRequest::createInstance(IWebMutableURLRequest* req)
     69 {
     70     WebMutableURLRequest* instance = new WebMutableURLRequest(true);
     71     instance->AddRef();
     72     instance->m_request = static_cast<WebMutableURLRequest*>(req)->m_request;
     73     return instance;
     74 }
     75 
     76 WebMutableURLRequest* WebMutableURLRequest::createInstance(const ResourceRequest& request)
     77 {
     78     WebMutableURLRequest* instance = new WebMutableURLRequest(true);
     79     instance->AddRef();
     80     instance->m_request = request;
     81     return instance;
     82 }
     83 
     84 WebMutableURLRequest* WebMutableURLRequest::createImmutableInstance()
     85 {
     86     WebMutableURLRequest* instance = new WebMutableURLRequest(false);
     87     instance->AddRef();
     88     return instance;
     89 }
     90 
     91 WebMutableURLRequest* WebMutableURLRequest::createImmutableInstance(const ResourceRequest& request)
     92 {
     93     WebMutableURLRequest* instance = new WebMutableURLRequest(false);
     94     instance->AddRef();
     95     instance->m_request = request;
     96     return instance;
     97 }
     98 
     99 WebMutableURLRequest::~WebMutableURLRequest()
    100 {
    101     gClassCount--;
    102     gClassNameCount.remove("WebMutableURLRequest");
    103 }
    104 
    105 // IUnknown -------------------------------------------------------------------
    106 
    107 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::QueryInterface(REFIID riid, void** ppvObject)
    108 {
    109     *ppvObject = 0;
    110     if (IsEqualGUID(riid, CLSID_WebMutableURLRequest))
    111         *ppvObject = this;
    112     else if (IsEqualGUID(riid, IID_IUnknown))
    113         *ppvObject = static_cast<IWebURLRequest*>(this);
    114     else if (IsEqualGUID(riid, IID_IWebMutableURLRequest) && m_isMutable)
    115         *ppvObject = static_cast<IWebMutableURLRequest*>(this);
    116     else if (IsEqualGUID(riid, __uuidof(IWebMutableURLRequestPrivate)) && m_isMutable)
    117         *ppvObject = static_cast<IWebMutableURLRequestPrivate*>(this);
    118     else if (IsEqualGUID(riid, IID_IWebURLRequest))
    119         *ppvObject = static_cast<IWebURLRequest*>(this);
    120     else
    121         return E_NOINTERFACE;
    122 
    123     AddRef();
    124     return S_OK;
    125 }
    126 
    127 ULONG STDMETHODCALLTYPE WebMutableURLRequest::AddRef(void)
    128 {
    129     return ++m_refCount;
    130 }
    131 
    132 ULONG STDMETHODCALLTYPE WebMutableURLRequest::Release(void)
    133 {
    134     ULONG newRef = --m_refCount;
    135     if (!newRef)
    136         delete(this);
    137 
    138     return newRef;
    139 }
    140 
    141 // IWebURLRequest --------------------------------------------------------------------
    142 
    143 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::requestWithURL(
    144     /* [in] */ BSTR /*theURL*/,
    145     /* [optional][in] */ WebURLRequestCachePolicy /*cachePolicy*/,
    146     /* [optional][in] */ double /*timeoutInterval*/)
    147 {
    148     ASSERT_NOT_REACHED();
    149     return E_NOTIMPL;
    150 }
    151 
    152 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::allHTTPHeaderFields(
    153     /* [retval][out] */ IPropertyBag** /*result*/)
    154 {
    155     ASSERT_NOT_REACHED();
    156     return E_NOTIMPL;
    157 }
    158 
    159 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::cachePolicy(
    160     /* [retval][out] */ WebURLRequestCachePolicy* result)
    161 {
    162     *result = kit(m_request.cachePolicy());
    163     return S_OK;
    164 }
    165 
    166 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::HTTPBody(
    167     /* [retval][out] */ IStream** /*result*/)
    168 {
    169     ASSERT_NOT_REACHED();
    170     return E_NOTIMPL;
    171 }
    172 
    173 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::HTTPBodyStream(
    174     /* [retval][out] */ IStream** /*result*/)
    175 {
    176     ASSERT_NOT_REACHED();
    177     return E_NOTIMPL;
    178 }
    179 
    180 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::HTTPMethod(
    181     /* [retval][out] */ BSTR* result)
    182 {
    183     BString httpMethod = BString(m_request.httpMethod());
    184     *result = httpMethod.release();
    185     return S_OK;
    186 }
    187 
    188 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::HTTPShouldHandleCookies(
    189     /* [retval][out] */ BOOL* /*result*/)
    190 {
    191     ASSERT_NOT_REACHED();
    192     return E_NOTIMPL;
    193 }
    194 
    195 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::initWithURL(
    196     /* [in] */ BSTR url,
    197     /* [optional][in] */ WebURLRequestCachePolicy cachePolicy,
    198     /* [optional][in] */ double timeoutInterval)
    199 {
    200     m_request.setURL(MarshallingHelpers::BSTRToKURL(url));
    201     m_request.setCachePolicy(core(cachePolicy));
    202     m_request.setTimeoutInterval(timeoutInterval);
    203 
    204     return S_OK;
    205 }
    206 
    207 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::mainDocumentURL(
    208     /* [retval][out] */ BSTR* result)
    209 {
    210     *result = MarshallingHelpers::KURLToBSTR(m_request.firstPartyForCookies());
    211     return S_OK;
    212 }
    213 
    214 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::timeoutInterval(
    215     /* [retval][out] */ double* result)
    216 {
    217     *result = m_request.timeoutInterval();
    218     return S_OK;
    219 }
    220 
    221 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::URL(
    222     /* [retval][out] */ BSTR* result)
    223 {
    224     *result = MarshallingHelpers::KURLToBSTR(m_request.url());
    225     return S_OK;
    226 }
    227 
    228 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::valueForHTTPHeaderField(
    229     /* [in] */ BSTR field,
    230     /* [retval][out] */ BSTR* result)
    231 {
    232     if (!result) {
    233         ASSERT_NOT_REACHED();
    234         return E_POINTER;
    235     }
    236 
    237     *result = BString(m_request.httpHeaderField(String(field, SysStringLen(field)))).release();
    238     return S_OK;
    239 }
    240 
    241 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::isEmpty(
    242     /* [retval][out] */ BOOL* result)
    243 {
    244     *result = m_request.isEmpty();
    245     return S_OK;
    246 }
    247 
    248 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::isEqual(
    249         /* [in] */ IWebURLRequest* other,
    250         /* [out, retval] */ BOOL* result)
    251 {
    252     COMPtr<WebMutableURLRequest> requestImpl(Query, other);
    253 
    254     if (!requestImpl) {
    255         *result = FALSE;
    256         return S_OK;
    257     }
    258 
    259     *result = m_request == requestImpl->resourceRequest();
    260     return S_OK;
    261 }
    262 
    263 
    264 // IWebMutableURLRequest --------------------------------------------------------
    265 
    266 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::addValue(
    267     /* [in] */ BSTR /*value*/,
    268     /* [in] */ BSTR /*field*/)
    269 {
    270     ASSERT_NOT_REACHED();
    271     return E_NOTIMPL;
    272 }
    273 
    274 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setAllHTTPHeaderFields(
    275     /* [in] */ IPropertyBag* /*headerFields*/)
    276 {
    277     ASSERT_NOT_REACHED();
    278     return E_NOTIMPL;
    279 }
    280 
    281 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setCachePolicy(
    282     /* [in] */ WebURLRequestCachePolicy policy)
    283 {
    284     m_request.setCachePolicy(core(policy));
    285     return S_OK;
    286 }
    287 
    288 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setHTTPBody(
    289     /* [in] */ IStream* /*data*/)
    290 {
    291     ASSERT_NOT_REACHED();
    292     return E_NOTIMPL;
    293 }
    294 
    295 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setHTTPBodyStream(
    296     /* [in] */ IStream* /*data*/)
    297 {
    298     ASSERT_NOT_REACHED();
    299     return E_NOTIMPL;
    300 }
    301 
    302 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setHTTPMethod(
    303     /* [in] */ BSTR method)
    304 {
    305     m_request.setHTTPMethod(String(method));
    306     return S_OK;
    307 }
    308 
    309 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setHTTPShouldHandleCookies(
    310     /* [in] */ BOOL handleCookies)
    311 {
    312     m_request.setAllowCookies(handleCookies);
    313     return S_OK;
    314 }
    315 
    316 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setMainDocumentURL(
    317     /* [in] */ BSTR /*theURL*/)
    318 {
    319     ASSERT_NOT_REACHED();
    320     return E_NOTIMPL;
    321 }
    322 
    323 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setTimeoutInterval(
    324     /* [in] */ double timeoutInterval)
    325 {
    326     m_request.setTimeoutInterval(timeoutInterval);
    327     return S_OK;
    328 }
    329 
    330 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setURL(
    331     /* [in] */ BSTR url)
    332 {
    333     m_request.setURL(MarshallingHelpers::BSTRToKURL(url));
    334     return S_OK;
    335 }
    336 
    337 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setValue(
    338     /* [in] */ BSTR value,
    339     /* [in] */ BSTR field)
    340 {
    341     String valueString(value, SysStringLen(value));
    342     String fieldString(field, SysStringLen(field));
    343     m_request.setHTTPHeaderField(fieldString, valueString);
    344     return S_OK;
    345 }
    346 
    347 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setAllowsAnyHTTPSCertificate(void)
    348 {
    349     ResourceHandle::setHostAllowsAnyHTTPSCertificate(m_request.url().host());
    350 
    351     return S_OK;
    352 }
    353 
    354 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::setClientCertificate(
    355     /* [in] */ OLE_HANDLE cert)
    356 {
    357     if (!cert)
    358         return E_POINTER;
    359 
    360     PCCERT_CONTEXT certContext = reinterpret_cast<PCCERT_CONTEXT>((ULONG64)cert);
    361     RetainPtr<CFDataRef> certData = WebCore::copyCertificateToData(certContext);
    362     ResourceHandle::setClientCertificate(m_request.url().host(), certData.get());
    363     return S_OK;
    364 }
    365 
    366 CFURLRequestRef STDMETHODCALLTYPE WebMutableURLRequest::cfRequest()
    367 {
    368     return m_request.cfURLRequest();
    369 }
    370 
    371 HRESULT STDMETHODCALLTYPE WebMutableURLRequest::mutableCopy(
    372         /* [out, retval] */ IWebMutableURLRequest** result)
    373 {
    374     if (!result)
    375         return E_POINTER;
    376 
    377 #if USE(CFNETWORK)
    378     RetainPtr<CFMutableURLRequestRef> mutableRequest(AdoptCF, CFURLRequestCreateMutableCopy(kCFAllocatorDefault, m_request.cfURLRequest()));
    379     *result = createInstance(ResourceRequest(mutableRequest.get()));
    380     return S_OK;
    381 #else
    382    notImplemented();
    383    return E_NOTIMPL;
    384 #endif
    385 }
    386 
    387 // IWebMutableURLRequest ----------------------------------------------------
    388 
    389 void WebMutableURLRequest::setFormData(const PassRefPtr<FormData> data)
    390 {
    391     m_request.setHTTPBody(data);
    392 }
    393 
    394 const PassRefPtr<FormData> WebMutableURLRequest::formData() const
    395 {
    396     return m_request.httpBody();
    397 }
    398 
    399 void WebMutableURLRequest::addHTTPHeaderFields(const HTTPHeaderMap& headerFields)
    400 {
    401     m_request.addHTTPHeaderFields(headerFields);
    402 }
    403 
    404 const HTTPHeaderMap& WebMutableURLRequest::httpHeaderFields() const
    405 {
    406     return m_request.httpHeaderFields();
    407 }
    408 
    409 const ResourceRequest& WebMutableURLRequest::resourceRequest() const
    410 {
    411     return m_request;
    412 }
    413