void setHTTPBody(CFMutableURLRequestRef request, PassRefPtr<FormData> formData) { if (!formData) return; size_t count = formData->elements().size(); if (count == 0) return; // Handle the common special case of one piece of form data, with no files. 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; } } // Precompute the content length so CFURLConnection doesn't use chunked mode. bool haveLength = true; long long length = 0; for (size_t i = 0; i < count; ++i) { const FormDataElement& element = formData->elements()[i]; if (element.m_type == FormDataElement::data) length += element.m_data.size(); else { long long size; if (fileSize(element.m_filename, size)) length += size; else haveLength = false; } } if (haveLength) { CFStringRef lengthStr = CFStringCreateWithFormat(0, 0, CFSTR("%lld"), length); CFURLRequestSetHTTPHeaderFieldValue(request, CFSTR("Content-Length"), lengthStr); CFRelease(lengthStr); } static WCReadStreamCallBacks formDataStreamCallbacks = { 1, formCreate, formFinalize, 0, formOpen, 0, formRead, 0, formCanRead, formClose, 0, 0, 0, formSchedule, formUnschedule }; CFReadStreamRef stream = CFReadStreamCreate(0, (CFReadStreamCallBacks *)&formDataStreamCallbacks, formData.releaseRef()); CFURLRequestSetHTTPRequestBodyStream(request, stream); CFRelease(stream); }
void setHTTPBody(CFMutableURLRequestRef request, PassRefPtr<FormData> formData) { if (!formData) { wkCFURLRequestSetHTTPRequestBodyParts(request, 0); return; } size_t count = formData->elements().size(); if (count == 0) return; // Handle the common special case of one piece of form data, with no files. 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); //Ricardo: comentando por error 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()); }