void getResourceRequest(ResourceRequest& request, CFURLRequestRef cfRequest)
{
    request = ResourceRequest(CFURLRequestGetURL(cfRequest));

    request.setCachePolicy((ResourceRequestCachePolicy)CFURLRequestGetCachePolicy(cfRequest));
    request.setTimeoutInterval(CFURLRequestGetTimeoutInterval(cfRequest));
    request.setMainDocumentURL(KURL(CFURLRequestGetMainDocumentURL(cfRequest)));
    if (CFStringRef method = CFURLRequestCopyHTTPRequestMethod(cfRequest)) {
        request.setHTTPMethod(method);
        CFRelease(method);
    }
    request.setAllowHTTPCookies(CFURLRequestShouldHandleHTTPCookies(cfRequest));

    if (CFDictionaryRef headers = CFURLRequestCopyAllHTTPHeaderFields(cfRequest)) {
        CFIndex headerCount = CFDictionaryGetCount(headers);
        Vector<const void*, 128> keys(headerCount);
        Vector<const void*, 128> values(headerCount);
        CFDictionaryGetKeysAndValues(headers, keys.data(), values.data());
        for (int i = 0; i < headerCount; ++i)
            request.setHTTPHeaderField((CFStringRef)keys[i], (CFStringRef)values[i]);
        CFRelease(headers);
    }


    if (CFDataRef bodyData = CFURLRequestCopyHTTPRequestBody(cfRequest)) {
        request.setHTTPBody(new FormData(CFDataGetBytePtr(bodyData), CFDataGetLength(bodyData)));
        CFRelease(bodyData);
    } else if (CFReadStreamRef bodyStream = CFURLRequestCopyHTTPRequestBodyStream(cfRequest)) {
        if (FormData* formData = httpBodyFromStream(bodyStream))
            request.setHTTPBody(formData);
        CFRelease(bodyStream);
    }
    // FIXME: what to do about arbitrary body streams?
}
void ResourceRequest::doUpdateResourceHTTPBody()
{
    if (!m_cfRequest) {
        m_httpBody = nullptr;
        return;
    }

    if (RetainPtr<CFDataRef> bodyData = adoptCF(CFURLRequestCopyHTTPRequestBody(m_cfRequest.get())))
        m_httpBody = FormData::create(CFDataGetBytePtr(bodyData.get()), CFDataGetLength(bodyData.get()));
    else if (RetainPtr<CFReadStreamRef> bodyStream = adoptCF(CFURLRequestCopyHTTPRequestBodyStream(m_cfRequest.get()))) {
        FormData* formData = httpBodyFromStream(bodyStream.get());
        // There is no FormData object if a client provided a custom data stream.
        // We shouldn't be looking at http body after client callbacks.
        ASSERT(formData);
        if (formData)
            m_httpBody = formData;
    }
}