void BlobResourceHandle::notifyResponseOnError() { ASSERT(m_errorCode); ResourceResponse response(firstRequest().url(), "text/plain", 0, String()); switch (m_errorCode) { case rangeError: response.setHTTPStatusCode(httpRequestedRangeNotSatisfiable); response.setHTTPStatusText(httpRequestedRangeNotSatisfiableText); break; case notFoundError: response.setHTTPStatusCode(httpNotFound); response.setHTTPStatusText(httpNotFoundText); break; case securityError: response.setHTTPStatusCode(httpNotAllowed); response.setHTTPStatusText(httpNotAllowedText); break; default: response.setHTTPStatusCode(httpInternalError); response.setHTTPStatusText(httpInternalErrorText); break; } // Note that we don't wait for continueDidReceiveResponse when using didReceiveResponseAsync. // This is not formally correct, but the client has to be a no-op anyway, because blobs can't be downloaded. if (usesAsyncCallbacks()) client()->didReceiveResponseAsync(this, response); else client()->didReceiveResponse(this, response); }
void BlobResourceHandle::notifyResponseOnSuccess() { ASSERT(isMainThread()); bool isRangeRequest = m_rangeOffset != kPositionNotSpecified; ResourceResponse response(firstRequest().url(), m_blobData->contentType(), m_totalRemainingSize, String()); response.setHTTPStatusCode(isRangeRequest ? httpPartialContent : httpOK); response.setHTTPStatusText(isRangeRequest ? httpPartialContentText : httpOKText); response.setHTTPHeaderField(HTTPHeaderName::ContentType, m_blobData->contentType()); response.setHTTPHeaderField(HTTPHeaderName::ContentLength, String::number(m_totalRemainingSize)); if (isRangeRequest) response.setHTTPHeaderField(HTTPHeaderName::ContentRange, ParsedContentRange(m_rangeOffset, m_rangeEnd, m_totalSize).headerValue()); // FIXME: If a resource identified with a blob: URL is a File object, user agents must use that file's name attribute, // as if the response had a Content-Disposition header with the filename parameter set to the File's name attribute. // Notably, this will affect a name suggested in "File Save As". // BlobResourceHandle cannot be used with downloading, and doesn't even wait for continueDidReceiveResponse. // It's currently client's responsibility to know that didReceiveResponseAsync cannot be used to convert a // load into a download or blobs. if (usesAsyncCallbacks()) client()->didReceiveResponseAsync(this, WTFMove(response)); else client()->didReceiveResponse(this, WTFMove(response)); }