17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Use of this source code is governed by a BSD-style license that can be 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// found in the LICENSE file. 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h" 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "RequestInit.h" 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/Dictionary.h" 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/V8Binding.h" 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/V8Blob.h" 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/V8FormData.h" 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/custom/V8ArrayBufferCustom.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/custom/V8ArrayBufferViewCustom.h" 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/fileapi/Blob.h" 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/serviceworkers/Headers.h" 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/blob/BlobData.h" 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/network/FormData.h" 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/ArrayBuffer.h" 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink { 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciRequestInit::RequestInit(ExecutionContext* context, const Dictionary& options, ExceptionState& exceptionState) 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DictionaryHelper::get(options, "method", method); 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DictionaryHelper::get(options, "headers", headers); 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!headers) { 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DictionaryHelper::get(options, "headers", headersDictionary); 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DictionaryHelper::get(options, "mode", mode); 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DictionaryHelper::get(options, "credentials", credentials); 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci v8::Local<v8::Value> body; 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!DictionaryHelper::get(options, "body", body) || body->IsUndefined() || body->IsNull()) 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci OwnPtr<BlobData> blobData = BlobData::create(); 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci v8::Isolate* isolate = toIsolate(context); 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (body->IsArrayBuffer()) { 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(v8::Handle<v8::Object>::Cast(body)); 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(arrayBuffer); 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendArrayBuffer(arrayBuffer); 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (body->IsArrayBufferView()) { 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(v8::Handle<v8::Object>::Cast(body)); 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(arrayBufferView); 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendArrayBufferView(arrayBufferView); 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (V8Blob::hasInstance(body, isolate)) { 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Blob* blob = V8Blob::toImpl(v8::Handle<v8::Object>::Cast(body)); 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(blob); 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blob->appendTo(*blobData); 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->setContentType(blob->type()); 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (V8FormData::hasInstance(body, isolate)) { 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DOMFormData* domFormData = V8FormData::toImpl(v8::Handle<v8::Object>::Cast(body)); 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(domFormData); 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtr<FormData> httpBody = domFormData->createMultiPartFormData(); 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < httpBody->elements().size(); ++i) { 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const FormDataElement& element = httpBody->elements()[i]; 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (element.m_type) { 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case FormDataElement::data: { 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendBytes(element.m_data.data(), element.m_data.size()); 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case FormDataElement::encodedFile: 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendFile(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime); 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case FormDataElement::encodedBlob: 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (element.m_optionalBlobDataHandle) 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendBlob(element.m_optionalBlobDataHandle, 0, element.m_optionalBlobDataHandle->size()); 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case FormDataElement::encodedFileSystemURL: 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendFileSystemURL(element.m_fileSystemURL, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime); 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_NOT_REACHED(); 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->setContentType(AtomicString("multipart/form-data; boundary=", AtomicString::ConstructFromLiteral) + httpBody->boundary().data()); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (body->IsString()) { 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String stringValue(toScalarValueString(body, exceptionState)); 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->appendText(stringValue, false); 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci blobData->setContentType("text/plain;charset=UTF-8"); 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const long long blobSize = blobData->length(); 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bodyBlobHandle = BlobDataHandle::create(blobData.release(), blobSize); 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 88