Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: Source/modules/fetch/Response.cpp

Issue 1258933002: Make the Response constructor throw when status is a null body status and body is non-null (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/http/tests/fetch/script-tests/response.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 const long long length = blobData->length(); 146 const long long length = blobData->length();
147 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), len gth)); 147 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), len gth));
148 return create(context, blob, ResponseInit(responseInit, exceptionState), exceptionState); 148 return create(context, blob, ResponseInit(responseInit, exceptionState), exceptionState);
149 } 149 }
150 ASSERT_NOT_REACHED(); 150 ASSERT_NOT_REACHED();
151 return nullptr; 151 return nullptr;
152 } 152 }
153 153
154 Response* Response::create(ExecutionContext* context, Blob* body, const Response Init& responseInit, ExceptionState& exceptionState) 154 Response* Response::create(ExecutionContext* context, Blob* body, const Response Init& responseInit, ExceptionState& exceptionState)
155 { 155 {
156 unsigned short status = responseInit.status;
157
156 // "1. If |init|'s status member is not in the range 200 to 599, throw a 158 // "1. If |init|'s status member is not in the range 200 to 599, throw a
157 // RangeError." 159 // RangeError."
158 if (responseInit.status < 200 || 599 < responseInit.status) { 160 if (status < 200 || 599 < status) {
159 exceptionState.throwRangeError("Invalid status"); 161 exceptionState.throwRangeError(ExceptionMessages::indexOutsideRange<unsi gned>("status", status, 200, ExceptionMessages::InclusiveBound, 599, ExceptionMe ssages::InclusiveBound));
160 return 0; 162 return 0;
161 } 163 }
162 164
163 // "2. If |init|'s statusText member does not match the Reason-Phrase 165 // "2. If init's status member is a null body status and body is non-null,
166 // throw a TypeError. A null body status is 101, 204, 205, or 304,
167 // spec link, See https://github.com/whatwg/fetch/issues/86 for details
philipj_slow 2015/07/28 09:52:51 The issue link is already in the description. I me
shiva.jm 2015/07/29 04:13:00 Done.
shiva.jm 2015/07/29 04:13:00 Done.
168 if ((status == 101 || status == 204 || status == 205 || status == 304) && bo dy) {
169 exceptionState.throwTypeError("Response with null body status cannot hav e body");
170 return 0;
171 }
172
173 // "3. If |init|'s statusText member does not match the Reason-Phrase
164 // token production, throw a TypeError." 174 // token production, throw a TypeError."
165 if (!isValidReasonPhrase(responseInit.statusText)) { 175 if (!isValidReasonPhrase(responseInit.statusText)) {
166 exceptionState.throwTypeError("Invalid statusText"); 176 exceptionState.throwTypeError("Invalid statusText");
167 return 0; 177 return 0;
168 } 178 }
169 179
170 // "3. Let |r| be a new Response object, associated with a new response, 180 // "4. Let |r| be a new Response object, associated with a new response,
171 // Headers object, and Body object." 181 // Headers object, and Body object."
172 Response* r = new Response(context); 182 Response* r = new Response(context);
173 r->suspendIfNeeded(); 183 r->suspendIfNeeded();
174 184
175 // "4. Set |r|'s response's status to |init|'s status member." 185 // "5. Set |r|'s response's status to |init|'s status member."
176 r->m_response->setStatus(responseInit.status); 186 r->m_response->setStatus(responseInit.status);
177 187
178 // "5. Set |r|'s response's status message to |init|'s statusText member." 188 // "6. Set |r|'s response's status message to |init|'s statusText member."
179 r->m_response->setStatusMessage(AtomicString(responseInit.statusText)); 189 r->m_response->setStatusMessage(AtomicString(responseInit.statusText));
180 190
181 // "6. If |init|'s headers member is present, run these substeps:" 191 // "7. If |init|'s headers member is present, run these substeps:"
182 if (responseInit.headers) { 192 if (responseInit.headers) {
183 // "1. Empty |r|'s response's header list." 193 // "1. Empty |r|'s response's header list."
184 r->m_response->headerList()->clearList(); 194 r->m_response->headerList()->clearList();
185 // "2. Fill |r|'s Headers object with |init|'s headers member. Rethrow 195 // "2. Fill |r|'s Headers object with |init|'s headers member. Rethrow
186 // any exceptions." 196 // any exceptions."
187 r->m_headers->fillWith(responseInit.headers.get(), exceptionState); 197 r->m_headers->fillWith(responseInit.headers.get(), exceptionState);
188 if (exceptionState.hadException()) 198 if (exceptionState.hadException())
189 return 0; 199 return 0;
190 } else if (!responseInit.headersDictionary.isUndefinedOrNull()) { 200 } else if (!responseInit.headersDictionary.isUndefinedOrNull()) {
191 // "1. Empty |r|'s response's header list." 201 // "1. Empty |r|'s response's header list."
192 r->m_response->headerList()->clearList(); 202 r->m_response->headerList()->clearList();
193 // "2. Fill |r|'s Headers object with |init|'s headers member. Rethrow 203 // "2. Fill |r|'s Headers object with |init|'s headers member. Rethrow
194 // any exceptions." 204 // any exceptions."
195 r->m_headers->fillWith(responseInit.headersDictionary, exceptionState); 205 r->m_headers->fillWith(responseInit.headersDictionary, exceptionState);
196 if (exceptionState.hadException()) 206 if (exceptionState.hadException())
197 return 0; 207 return 0;
198 } 208 }
199 // "7. If body is given, run these substeps:" 209 // "8. If body is given, run these substeps:"
200 if (body) { 210 if (body) {
201 // "1. Let |stream| and |Content-Type| be the result of extracting body. " 211 // "1. Let |stream| and |Content-Type| be the result of extracting body. "
202 // "2. Set |r|'s response's body to |stream|." 212 // "2. Set |r|'s response's body to |stream|."
203 // "3. If |Content-Type| is non-null and |r|'s response's header list 213 // "3. If |Content-Type| is non-null and |r|'s response's header list
204 // contains no header named `Content-Type`, append `Content-Type`/ 214 // contains no header named `Content-Type`, append `Content-Type`/
205 // |Content-Type| to |r|'s response's header list." 215 // |Content-Type| to |r|'s response's header list."
206 // https://fetch.spec.whatwg.org/#concept-bodyinit-extract 216 // https://fetch.spec.whatwg.org/#concept-bodyinit-extract
207 // Step 3, Blob: 217 // Step 3, Blob:
208 // "If object's type attribute is not the empty byte sequence, set 218 // "If object's type attribute is not the empty byte sequence, set
209 // Content-Type to its value." 219 // Content-Type to its value."
210 r->m_response->replaceBodyStreamBuffer(BodyStreamBuffer::create(FetchBlo bDataConsumerHandle::create(context, body->blobDataHandle()))); 220 r->m_response->replaceBodyStreamBuffer(BodyStreamBuffer::create(FetchBlo bDataConsumerHandle::create(context, body->blobDataHandle())));
211 r->refreshBody(); 221 r->refreshBody();
212 if (!body->type().isEmpty() && !r->m_response->headerList()->has("Conten t-Type")) 222 if (!body->type().isEmpty() && !r->m_response->headerList()->has("Conten t-Type"))
213 r->m_response->headerList()->append("Content-Type", body->type()); 223 r->m_response->headerList()->append("Content-Type", body->type());
214 } 224 }
215 225
216 // "8. Set |r|'s MIME type to the result of extracting a MIME type 226 // "9. Set |r|'s MIME type to the result of extracting a MIME type
217 // from |r|'s response's header list." 227 // from |r|'s response's header list."
218 r->m_response->setMIMEType(r->m_response->headerList()->extractMIMEType()); 228 r->m_response->setMIMEType(r->m_response->headerList()->extractMIMEType());
219 229
220 // "9. Return |r|." 230 // "10. Return |r|."
221 return r; 231 return r;
222 } 232 }
223 233
224 Response* Response::create(ExecutionContext* context, FetchResponseData* respons e) 234 Response* Response::create(ExecutionContext* context, FetchResponseData* respons e)
225 { 235 {
226 Response* r = new Response(context, response); 236 Response* r = new Response(context, response);
227 r->suspendIfNeeded(); 237 r->suspendIfNeeded();
228 return r; 238 return r;
229 } 239 }
230 240
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 } 444 }
435 445
436 DEFINE_TRACE(Response) 446 DEFINE_TRACE(Response)
437 { 447 {
438 Body::trace(visitor); 448 Body::trace(visitor);
439 visitor->trace(m_response); 449 visitor->trace(m_response);
440 visitor->trace(m_headers); 450 visitor->trace(m_headers);
441 } 451 }
442 452
443 } // namespace blink 453 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/http/tests/fetch/script-tests/response.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698