OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/fetch/Body.h" | 5 #include "modules/fetch/Body.h" |
6 | 6 |
7 #include "bindings/core/v8/ScriptPromiseResolver.h" | 7 #include "bindings/core/v8/ScriptPromiseResolver.h" |
8 #include "bindings/core/v8/ScriptState.h" | 8 #include "bindings/core/v8/ScriptState.h" |
9 #include "bindings/core/v8/V8ArrayBuffer.h" | 9 #include "bindings/core/v8/V8ArrayBuffer.h" |
10 #include "bindings/core/v8/V8ThrowException.h" | 10 #include "bindings/core/v8/V8ThrowException.h" |
11 #include "core/dom/DOMArrayBuffer.h" | 11 #include "core/dom/DOMArrayBuffer.h" |
12 #include "core/dom/DOMTypedArray.h" | 12 #include "core/dom/DOMTypedArray.h" |
| 13 #include "core/dom/URLSearchParams.h" |
13 #include "core/fileapi/Blob.h" | 14 #include "core/fileapi/Blob.h" |
14 #include "core/frame/UseCounter.h" | 15 #include "core/frame/UseCounter.h" |
| 16 #include "core/html/FormData.h" |
15 #include "modules/fetch/BodyStreamBuffer.h" | 17 #include "modules/fetch/BodyStreamBuffer.h" |
16 #include "modules/fetch/FetchDataLoader.h" | 18 #include "modules/fetch/FetchDataLoader.h" |
| 19 #include "platform/network/ParsedContentType.h" |
17 #include "public/platform/WebDataConsumerHandle.h" | 20 #include "public/platform/WebDataConsumerHandle.h" |
18 #include "wtf/PassRefPtr.h" | 21 #include "wtf/PassRefPtr.h" |
19 #include "wtf/RefPtr.h" | 22 #include "wtf/RefPtr.h" |
20 #include <memory> | 23 #include <memory> |
21 | 24 |
22 namespace blink { | 25 namespace blink { |
23 | 26 |
24 namespace { | 27 namespace { |
25 | 28 |
26 class BodyConsumerBase : public GarbageCollectedFinalized<BodyConsumerBase>, | 29 class BodyConsumerBase : public GarbageCollectedFinalized<BodyConsumerBase>, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 68 |
66 public: | 69 public: |
67 explicit BodyArrayBufferConsumer(ScriptPromiseResolver* resolver) | 70 explicit BodyArrayBufferConsumer(ScriptPromiseResolver* resolver) |
68 : BodyConsumerBase(resolver) {} | 71 : BodyConsumerBase(resolver) {} |
69 | 72 |
70 void didFetchDataLoadedArrayBuffer(DOMArrayBuffer* arrayBuffer) override { | 73 void didFetchDataLoadedArrayBuffer(DOMArrayBuffer* arrayBuffer) override { |
71 resolver()->resolve(arrayBuffer); | 74 resolver()->resolve(arrayBuffer); |
72 } | 75 } |
73 }; | 76 }; |
74 | 77 |
| 78 class BodyFormDataConsumer final : public BodyConsumerBase { |
| 79 WTF_MAKE_NONCOPYABLE(BodyFormDataConsumer); |
| 80 |
| 81 public: |
| 82 explicit BodyFormDataConsumer(ScriptPromiseResolver* resolver) |
| 83 : BodyConsumerBase(resolver) {} |
| 84 |
| 85 void didFetchDataLoadedFormData(FormData* formData) override { |
| 86 resolver()->resolve(formData); |
| 87 } |
| 88 |
| 89 void didFetchDataLoadedString(const String& string) override { |
| 90 FormData* formData = FormData::create(); |
| 91 for (const auto& pair : URLSearchParams::create(string)->params()) |
| 92 formData->append(pair.first, pair.second); |
| 93 didFetchDataLoadedFormData(formData); |
| 94 } |
| 95 }; |
| 96 |
75 class BodyTextConsumer final : public BodyConsumerBase { | 97 class BodyTextConsumer final : public BodyConsumerBase { |
76 WTF_MAKE_NONCOPYABLE(BodyTextConsumer); | 98 WTF_MAKE_NONCOPYABLE(BodyTextConsumer); |
77 | 99 |
78 public: | 100 public: |
79 explicit BodyTextConsumer(ScriptPromiseResolver* resolver) | 101 explicit BodyTextConsumer(ScriptPromiseResolver* resolver) |
80 : BodyConsumerBase(resolver) {} | 102 : BodyConsumerBase(resolver) {} |
81 | 103 |
82 void didFetchDataLoadedString(const String& string) override { | 104 void didFetchDataLoadedString(const String& string) override { |
83 resolver()->resolve(string); | 105 resolver()->resolve(string); |
84 } | 106 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 new BodyBlobConsumer(resolver)); | 173 new BodyBlobConsumer(resolver)); |
152 } else { | 174 } else { |
153 std::unique_ptr<BlobData> blobData = BlobData::create(); | 175 std::unique_ptr<BlobData> blobData = BlobData::create(); |
154 blobData->setContentType(mimeType()); | 176 blobData->setContentType(mimeType()); |
155 resolver->resolve( | 177 resolver->resolve( |
156 Blob::create(BlobDataHandle::create(std::move(blobData), 0))); | 178 Blob::create(BlobDataHandle::create(std::move(blobData), 0))); |
157 } | 179 } |
158 return promise; | 180 return promise; |
159 } | 181 } |
160 | 182 |
| 183 ScriptPromise Body::formData(ScriptState* scriptState) { |
| 184 ScriptPromise promise = rejectInvalidConsumption(scriptState); |
| 185 if (!promise.isEmpty()) |
| 186 return promise; |
| 187 |
| 188 // See above comment. |
| 189 if (!scriptState->getExecutionContext()) |
| 190 return ScriptPromise(); |
| 191 |
| 192 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| 193 const ParsedContentType parsedTypeWithParameters(contentType()); |
| 194 const String parsedType = parsedTypeWithParameters.mimeType().lower(); |
| 195 promise = resolver->promise(); |
| 196 if (parsedType == "multipart/form-data") { |
| 197 const String boundary = |
| 198 parsedTypeWithParameters.parameterValueForName("boundary"); |
| 199 if (bodyBuffer() && !boundary.isEmpty()) { |
| 200 bodyBuffer()->startLoading( |
| 201 FetchDataLoader::createLoaderAsFormData(boundary), |
| 202 new BodyFormDataConsumer(resolver)); |
| 203 return promise; |
| 204 } |
| 205 } else if (parsedType == "application/x-www-form-urlencoded") { |
| 206 if (bodyBuffer()) { |
| 207 bodyBuffer()->startLoading(FetchDataLoader::createLoaderAsString(), |
| 208 new BodyFormDataConsumer(resolver)); |
| 209 } else { |
| 210 resolver->resolve(FormData::create()); |
| 211 } |
| 212 return promise; |
| 213 } else { |
| 214 if (bodyBuffer()) |
| 215 bodyBuffer()->closeAndLockAndDisturb(); |
| 216 } |
| 217 |
| 218 resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(), |
| 219 "Invalid MIME type")); |
| 220 return promise; |
| 221 } |
| 222 |
161 ScriptPromise Body::json(ScriptState* scriptState) { | 223 ScriptPromise Body::json(ScriptState* scriptState) { |
162 ScriptPromise promise = rejectInvalidConsumption(scriptState); | 224 ScriptPromise promise = rejectInvalidConsumption(scriptState); |
163 if (!promise.isEmpty()) | 225 if (!promise.isEmpty()) |
164 return promise; | 226 return promise; |
165 | 227 |
166 // See above comment. | 228 // See above comment. |
167 if (!scriptState->getExecutionContext()) | 229 if (!scriptState->getExecutionContext()) |
168 return ScriptPromise(); | 230 return ScriptPromise(); |
169 | 231 |
170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); | 232 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 | 292 |
231 ScriptPromise Body::rejectInvalidConsumption(ScriptState* scriptState) { | 293 ScriptPromise Body::rejectInvalidConsumption(ScriptState* scriptState) { |
232 if (isBodyLocked() || bodyUsed()) | 294 if (isBodyLocked() || bodyUsed()) |
233 return ScriptPromise::reject( | 295 return ScriptPromise::reject( |
234 scriptState, V8ThrowException::createTypeError(scriptState->isolate(), | 296 scriptState, V8ThrowException::createTypeError(scriptState->isolate(), |
235 "Already read")); | 297 "Already read")); |
236 return ScriptPromise(); | 298 return ScriptPromise(); |
237 } | 299 } |
238 | 300 |
239 } // namespace blink | 301 } // namespace blink |
OLD | NEW |