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 "config.h" | 5 #include "config.h" |
6 #include "modules/fetch/Response.h" | 6 #include "modules/fetch/Response.h" |
7 | 7 |
8 #include "bindings/core/v8/Dictionary.h" | 8 #include "bindings/core/v8/Dictionary.h" |
9 #include "bindings/core/v8/ExceptionState.h" | 9 #include "bindings/core/v8/ExceptionState.h" |
10 #include "core/dom/DOMArrayBuffer.h" | 10 #include "core/dom/DOMArrayBuffer.h" |
11 #include "core/dom/DOMArrayBufferView.h" | 11 #include "core/dom/DOMArrayBufferView.h" |
12 #include "core/fileapi/Blob.h" | 12 #include "core/fileapi/Blob.h" |
13 #include "core/html/DOMFormData.h" | 13 #include "core/html/DOMFormData.h" |
| 14 #include "modules/fetch/BodyStreamBuffer.h" |
| 15 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
14 #include "modules/fetch/ResponseInit.h" | 16 #include "modules/fetch/ResponseInit.h" |
15 #include "platform/network/FormData.h" | 17 #include "platform/network/FormData.h" |
16 #include "platform/network/HTTPHeaderMap.h" | 18 #include "platform/network/HTTPHeaderMap.h" |
17 #include "public/platform/WebServiceWorkerResponse.h" | 19 #include "public/platform/WebServiceWorkerResponse.h" |
18 #include "wtf/RefPtr.h" | 20 #include "wtf/RefPtr.h" |
19 | 21 |
20 namespace blink { | 22 namespace blink { |
21 | 23 |
22 namespace { | 24 namespace { |
23 | 25 |
24 FetchResponseData* createFetchResponseDataFromWebResponse(const WebServiceWorker
Response& webResponse) | 26 FetchResponseData* createFetchResponseDataFromWebResponse(ExecutionContext* exec
utionContext, const WebServiceWorkerResponse& webResponse) |
25 { | 27 { |
26 FetchResponseData* response = 0; | 28 FetchResponseData* response = 0; |
27 if (200 <= webResponse.status() && webResponse.status() < 300) | 29 if (200 <= webResponse.status() && webResponse.status() < 300) |
28 response = FetchResponseData::create(); | 30 response = FetchResponseData::create(); |
29 else | 31 else |
30 response = FetchResponseData::createNetworkErrorResponse(); | 32 response = FetchResponseData::createNetworkErrorResponse(); |
31 | 33 |
32 response->setURL(webResponse.url()); | 34 response->setURL(webResponse.url()); |
33 response->setStatus(webResponse.status()); | 35 response->setStatus(webResponse.status()); |
34 response->setStatusMessage(webResponse.statusText()); | 36 response->setStatusMessage(webResponse.statusText()); |
35 | 37 |
36 for (HTTPHeaderMap::const_iterator i = webResponse.headers().begin(), end =
webResponse.headers().end(); i != end; ++i) { | 38 for (HTTPHeaderMap::const_iterator i = webResponse.headers().begin(), end =
webResponse.headers().end(); i != end; ++i) { |
37 response->headerList()->append(i->key, i->value); | 39 response->headerList()->append(i->key, i->value); |
38 } | 40 } |
39 | 41 |
40 response->setBlobDataHandle(webResponse.blobDataHandle()); | 42 response->replaceBodyStreamBuffer(BodyStreamBuffer2::create(FetchBlobDataCon
sumerHandle::create(executionContext, webResponse.blobDataHandle()))); |
41 | 43 |
42 // Filter the response according to |webResponse|'s ResponseType. | 44 // Filter the response according to |webResponse|'s ResponseType. |
43 switch (webResponse.responseType()) { | 45 switch (webResponse.responseType()) { |
44 case WebServiceWorkerResponseTypeBasic: | 46 case WebServiceWorkerResponseTypeBasic: |
45 response = response->createBasicFilteredResponse(); | 47 response = response->createBasicFilteredResponse(); |
46 break; | 48 break; |
47 case WebServiceWorkerResponseTypeCORS: | 49 case WebServiceWorkerResponseTypeCORS: |
48 response = response->createCORSFilteredResponse(); | 50 response = response->createCORSFilteredResponse(); |
49 break; | 51 break; |
50 case WebServiceWorkerResponseTypeOpaque: | 52 case WebServiceWorkerResponseTypeOpaque: |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 if (body) { | 200 if (body) { |
199 // "1. Let |stream| and |Content-Type| be the result of extracting body.
" | 201 // "1. Let |stream| and |Content-Type| be the result of extracting body.
" |
200 // "2. Set |r|'s response's body to |stream|." | 202 // "2. Set |r|'s response's body to |stream|." |
201 // "3. If |Content-Type| is non-null and |r|'s response's header list | 203 // "3. If |Content-Type| is non-null and |r|'s response's header list |
202 // contains no header named `Content-Type`, append `Content-Type`/ | 204 // contains no header named `Content-Type`, append `Content-Type`/ |
203 // |Content-Type| to |r|'s response's header list." | 205 // |Content-Type| to |r|'s response's header list." |
204 // https://fetch.spec.whatwg.org/#concept-bodyinit-extract | 206 // https://fetch.spec.whatwg.org/#concept-bodyinit-extract |
205 // Step 3, Blob: | 207 // Step 3, Blob: |
206 // "If object's type attribute is not the empty byte sequence, set | 208 // "If object's type attribute is not the empty byte sequence, set |
207 // Content-Type to its value." | 209 // Content-Type to its value." |
208 r->m_response->setBlobDataHandle(body->blobDataHandle()); | 210 BodyStreamBuffer2* buffer = BodyStreamBuffer2::create(FetchBlobDataConsu
merHandle::create(context, body->blobDataHandle())); |
209 r->setBody(body->blobDataHandle()); | 211 r->m_response->replaceBodyStreamBuffer(buffer); |
| 212 r->setBody(buffer); |
210 if (!body->type().isEmpty() && !r->m_response->headerList()->has("Conten
t-Type")) | 213 if (!body->type().isEmpty() && !r->m_response->headerList()->has("Conten
t-Type")) |
211 r->m_response->headerList()->append("Content-Type", body->type()); | 214 r->m_response->headerList()->append("Content-Type", body->type()); |
212 } | 215 } |
213 | 216 |
214 // "8. Set |r|'s MIME type to the result of extracting a MIME type | 217 // "8. Set |r|'s MIME type to the result of extracting a MIME type |
215 // from |r|'s response's header list." | 218 // from |r|'s response's header list." |
216 r->m_response->setMIMEType(r->m_response->headerList()->extractMIMEType()); | 219 r->m_response->setMIMEType(r->m_response->headerList()->extractMIMEType()); |
217 | 220 |
218 // "9. Return |r|." | 221 // "9. Return |r|." |
219 return r; | 222 return r; |
220 } | 223 } |
221 | 224 |
222 Response* Response::create(ExecutionContext* context, FetchResponseData* respons
e) | 225 Response* Response::create(ExecutionContext* context, FetchResponseData* respons
e) |
223 { | 226 { |
224 Response* r = new Response(context, response); | 227 Response* r = new Response(context, response); |
225 r->suspendIfNeeded(); | 228 r->suspendIfNeeded(); |
226 return r; | 229 return r; |
227 } | 230 } |
228 | 231 |
229 Response* Response::create(ExecutionContext* context, const WebServiceWorkerResp
onse& webResponse) | 232 Response* Response::create(ExecutionContext* context, const WebServiceWorkerResp
onse& webResponse) |
230 { | 233 { |
231 FetchResponseData* responseData = createFetchResponseDataFromWebResponse(web
Response); | 234 FetchResponseData* responseData = createFetchResponseDataFromWebResponse(con
text, webResponse); |
232 Response* r = new Response(context, responseData); | 235 Response* r = new Response(context, responseData); |
233 r->suspendIfNeeded(); | 236 r->suspendIfNeeded(); |
234 return r; | 237 return r; |
235 } | 238 } |
236 | 239 |
237 Response* Response::error(ExecutionContext* context) | 240 Response* Response::error(ExecutionContext* context) |
238 { | 241 { |
239 FetchResponseData* responseData = FetchResponseData::createNetworkErrorRespo
nse(); | 242 FetchResponseData* responseData = FetchResponseData::createNetworkErrorRespo
nse(); |
240 Response* r = new Response(context, responseData); | 243 Response* r = new Response(context, responseData); |
241 r->m_headers->setGuard(Headers::ImmutableGuard); | 244 r->m_headers->setGuard(Headers::ImmutableGuard); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 return m_headers; | 324 return m_headers; |
322 } | 325 } |
323 | 326 |
324 Response* Response::clone(ExceptionState& exceptionState) | 327 Response* Response::clone(ExceptionState& exceptionState) |
325 { | 328 { |
326 if (bodyUsed()) { | 329 if (bodyUsed()) { |
327 exceptionState.throwTypeError("Response body is already used"); | 330 exceptionState.throwTypeError("Response body is already used"); |
328 return nullptr; | 331 return nullptr; |
329 } | 332 } |
330 if (isBodyConsumed()) { | 333 if (isBodyConsumed()) { |
331 BodyStreamBuffer* drainingStream = createDrainingStream(); | 334 m_response->replaceBodyStreamBuffer(createDrainingStream()); |
332 m_response->replaceBodyStreamBuffer(drainingStream); | |
333 } | 335 } |
334 | 336 |
335 FetchResponseData* response = m_response->clone(); | 337 FetchResponseData* response = m_response->clone(executionContext()); |
336 Headers* headers = Headers::create(response->headerList()); | 338 Headers* headers = Headers::create(response->headerList()); |
337 headers->setGuard(m_headers->guard()); | 339 headers->setGuard(m_headers->guard()); |
338 Response* r = new Response(executionContext(), response, headers); | 340 Response* r = new Response(executionContext(), response, headers); |
339 r->suspendIfNeeded(); | 341 r->suspendIfNeeded(); |
340 | 342 |
341 // Lock the old body and set |body| property to the new one. | 343 // Lock the old body and set |body| property to the new one. |
342 lockBody(); | 344 lockBody(); |
343 refreshBody(); | 345 refreshBody(); |
344 | 346 |
345 return r; | 347 return r; |
(...skipping 23 matching lines...) Expand all Loading... |
369 } | 371 } |
370 | 372 |
371 Response::Response(ExecutionContext* context, FetchResponseData* response, Heade
rs* headers) | 373 Response::Response(ExecutionContext* context, FetchResponseData* response, Heade
rs* headers) |
372 : Body(context) , m_response(response) , m_headers(headers) | 374 : Body(context) , m_response(response) , m_headers(headers) |
373 { | 375 { |
374 refreshBody(); | 376 refreshBody(); |
375 } | 377 } |
376 | 378 |
377 bool Response::hasBody() const | 379 bool Response::hasBody() const |
378 { | 380 { |
379 return internalBlobDataHandle() || internalBuffer(); | 381 return internalBuffer(); |
380 } | 382 } |
381 | 383 |
382 PassRefPtr<BlobDataHandle> Response::blobDataHandle() const | 384 BodyStreamBuffer2* Response::buffer() const |
383 { | |
384 return m_response->blobDataHandle(); | |
385 } | |
386 | |
387 BodyStreamBuffer* Response::buffer() const | |
388 { | 385 { |
389 return m_response->buffer(); | 386 return m_response->buffer(); |
390 } | 387 } |
391 | 388 |
392 String Response::mimeType() const | 389 String Response::mimeType() const |
393 { | 390 { |
394 return m_response->mimeType(); | 391 return m_response->mimeType(); |
395 } | 392 } |
396 | 393 |
397 PassRefPtr<BlobDataHandle> Response::internalBlobDataHandle() const | 394 BodyStreamBuffer2* Response::internalBuffer() const |
398 { | |
399 return m_response->internalBlobDataHandle(); | |
400 } | |
401 | |
402 BodyStreamBuffer* Response::internalBuffer() const | |
403 { | 395 { |
404 return m_response->internalBuffer(); | 396 return m_response->internalBuffer(); |
405 } | 397 } |
406 | 398 |
407 String Response::internalMIMEType() const | 399 String Response::internalMIMEType() const |
408 { | 400 { |
409 return m_response->internalMIMEType(); | 401 return m_response->internalMIMEType(); |
410 } | 402 } |
411 | 403 |
412 void Response::refreshBody() | 404 void Response::refreshBody() |
413 { | 405 { |
414 if (m_response->buffer()) | 406 setBody(m_response->buffer()); |
415 setBody(m_response->buffer()); | |
416 else | |
417 setBody(m_response->blobDataHandle()); | |
418 } | 407 } |
419 | 408 |
420 DEFINE_TRACE(Response) | 409 DEFINE_TRACE(Response) |
421 { | 410 { |
422 Body::trace(visitor); | 411 Body::trace(visitor); |
423 visitor->trace(m_response); | 412 visitor->trace(m_response); |
424 visitor->trace(m_headers); | 413 visitor->trace(m_headers); |
425 } | 414 } |
426 | 415 |
427 } // namespace blink | 416 } // namespace blink |
OLD | NEW |