PassRefPtr<FormData> httpBodyFromRequest(CFURLRequestRef request) { if (RetainPtr<CFDataRef> bodyData = CFURLRequestCopyHTTPRequestBody(request)) return FormData::create(CFDataGetBytePtr(bodyData.get()), CFDataGetLength(bodyData.get())); if (wkCanAccessCFURLRequestHTTPBodyParts()) { 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(); } } else { if (RetainPtr<CFReadStreamRef> bodyStream = CFURLRequestCopyHTTPRequestBodyStream(request)) return getStreamFormDatas().get(bodyStream.get()); } // FIXME: what to do about arbitrary body streams? return 0; }
static void formFinalize(CFReadStreamRef stream, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); getStreamFormDatas().remove(stream); closeCurrentStream(form); CFRelease(form->scheduledRunLoopPairs); delete form; }
static void* formCreate(CFReadStreamRef stream, void* context) { FormData* formData = static_cast<FormData*>(context); CFSetCallBacks runLoopAndModeCallBacks = { 0, pairRetain, pairRelease, NULL, pairEqual, pairHash }; FormStreamFields* newInfo = new FormStreamFields; newInfo->scheduledRunLoopPairs = CFSetCreateMutable(0, 0, &runLoopAndModeCallBacks); newInfo->currentStream = NULL; newInfo->currentData = 0; newInfo->formStream = stream; // Don't retain. That would create a reference cycle. // Append in reverse order since we remove elements from the end. size_t size = formData->elements().size(); newInfo->remainingElements.reserveCapacity(size); for (size_t i = 0; i < size; ++i) newInfo->remainingElements.append(formData->elements()[size - i - 1]); getStreamFormDatas().set(stream, adoptRef(formData)); return newInfo; }
FormData* httpBodyFromStream(CFReadStreamRef stream) { return getStreamFormDatas().get(stream).get(); }