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