FormDataStreamCFNet.cpp [plain text]
#include "config.h"
#include "FormDataStreamCFNet.h"
#if USE(CFNETWORK)
#include "FileSystem.h"
#include "FormData.h"
#include <CFNetwork/CFURLRequestPriv.h>
#include <CoreFoundation/CFStreamAbstract.h>
#include <WebKitSystemInterface/WebKitSystemInterface.h>
#include <sys/types.h>
#include <wtf/Assertions.h>
#include <wtf/HashMap.h>
#include <wtf/RetainPtr.h>
#include <wtf/text/CString.h>
#define USE_V1_CFSTREAM_CALLBACKS
#ifdef USE_V1_CFSTREAM_CALLBACKS
typedef CFReadStreamCallBacksV1 WCReadStreamCallBacks;
#else
typedef CFReadStreamCallBacks WCReadStreamCallBacks;
#endif
namespace WebCore {
void setHTTPBody(CFMutableURLRequestRef request, PassRefPtr<FormData> formData)
{
if (!formData) {
wkCFURLRequestSetHTTPRequestBodyParts(request, 0);
return;
}
size_t count = formData->elements().size();
if (count == 0)
return;
if (count == 1) {
const FormDataElement& element = formData->elements()[0];
if (element.m_type == FormDataElement::data) {
CFDataRef data = CFDataCreate(0, reinterpret_cast<const UInt8 *>(element.m_data.data()), element.m_data.size());
CFURLRequestSetHTTPRequestBody(request, data);
CFRelease(data);
return;
}
}
RetainPtr<CFMutableArrayRef> array(AdoptCF, CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks));
for (size_t i = 0; i < count; ++i) {
const FormDataElement& element = formData->elements()[i];
if (element.m_type == FormDataElement::data) {
RetainPtr<CFDataRef> data(AdoptCF, CFDataCreate(0, reinterpret_cast<const UInt8*>(element.m_data.data()), element.m_data.size()));
CFArrayAppendValue(array.get(), data.get());
} else {
RetainPtr<CFStringRef> filename(AdoptCF, element.m_filename.createCFString());
CFArrayAppendValue(array.get(), filename.get());
}
}
wkCFURLRequestSetHTTPRequestBodyParts(request, array.get());
}
PassRefPtr<FormData> httpBodyFromRequest(CFURLRequestRef request)
{
if (RetainPtr<CFDataRef> bodyData = CFURLRequestCopyHTTPRequestBody(request))
return FormData::create(CFDataGetBytePtr(bodyData.get()), CFDataGetLength(bodyData.get()));
if (RetainPtr<CFArrayRef> bodyParts = wkCFURLRequestCopyHTTPRequestBodyParts(request)) {
RefPtr<FormData> formData = FormData::create();
CFIndex count = CFArrayGetCount(bodyParts.get());
for (CFIndex i = 0; i < count; i++) {
CFTypeRef bodyPart = CFArrayGetValueAtIndex(bodyParts.get(), i);
CFTypeID typeID = CFGetTypeID(bodyPart);
if (typeID == CFStringGetTypeID()) {
String filename = (CFStringRef)bodyPart;
formData->appendFile(filename);
} else if (typeID == CFDataGetTypeID()) {
CFDataRef data = (CFDataRef)bodyPart;
formData->appendData(CFDataGetBytePtr(data), CFDataGetLength(data));
} else
ASSERT_NOT_REACHED();
}
return formData.release();
}
return 0;
}
}
#endif // USE(CFNETWORK)