ResourceResponseCurl.cpp [plain text]
#include "config.h"
#if USE(CURL)
#include "ResourceResponse.h"
#include "CurlResponse.h"
#include "HTTPParsers.h"
namespace WebCore {
bool ResourceResponse::isAppendableHeader(const String &key)
{
static const char* appendableHeaders[] = {
"access-control-allow-headers",
"access-control-allow-methods",
"access-control-allow-origin",
"access-control-expose-headers",
"allow",
"cache-control",
"connection",
"content-encoding",
"content-language",
"if-match",
"if-none-match",
"keep-alive",
"pragma",
"proxy-authenticate",
"public",
"server",
"set-cookie",
"te",
"trailer",
"transfer-encoding",
"upgrade",
"user-agent",
"vary",
"via",
"warning",
"www-authenticate"
};
if (startsWithLettersIgnoringASCIICase(key, "x-"))
return true;
for (const auto& header : appendableHeaders) {
if (equalIgnoringASCIICase(key, header))
return true;
}
return false;
}
ResourceResponse::ResourceResponse(const CurlResponse& response)
: ResourceResponseBase(response.url, "", response.expectedContentLength, "")
{
setHTTPStatusCode(response.statusCode);
for (const auto& header : response.headers)
appendHTTPHeaderField(header);
setMimeType(extractMIMETypeFromMediaType(httpHeaderField(HTTPHeaderName::ContentType)).convertToASCIILowercase());
setTextEncodingName(extractCharsetFromMediaType(httpHeaderField(HTTPHeaderName::ContentType)));
}
void ResourceResponse::appendHTTPHeaderField(const String& header)
{
auto splitPosition = header.find(':');
if (splitPosition != notFound) {
auto key = header.left(splitPosition).stripWhiteSpace();
auto value = header.substring(splitPosition + 1).stripWhiteSpace();
if (isAppendableHeader(key))
addHTTPHeaderField(key, value);
else
setHTTPHeaderField(key, value);
} else if (startsWithLettersIgnoringASCIICase(header, "http")) {
setStatusLine(header);
}
}
void ResourceResponse::setStatusLine(const String& header)
{
auto statusLine = header.stripWhiteSpace();
auto httpVersionEndPosition = statusLine.find(' ');
auto statusCodeEndPosition = notFound;
if (httpVersionEndPosition != notFound) {
auto httpVersion = statusLine.left(httpVersionEndPosition);
setHTTPVersion(httpVersion.stripWhiteSpace());
statusLine = statusLine.substring(httpVersionEndPosition + 1).stripWhiteSpace();
statusCodeEndPosition = statusLine.find(' ');
}
if (statusCodeEndPosition != notFound) {
auto statusText = statusLine.substring(statusCodeEndPosition + 1);
setHTTPStatusText(statusText.stripWhiteSpace());
}
}
String ResourceResponse::platformSuggestedFilename() const
{
return filenameFromHTTPContentDisposition(httpHeaderField(HTTPHeaderName::ContentDisposition));
}
bool ResourceResponse::shouldRedirect()
{
auto statusCode = httpStatusCode();
if (statusCode < 300 || 400 <= statusCode)
return false;
if (statusCode == 300 || statusCode == 304 || statusCode == 305 || statusCode == 306)
return false;
if (httpHeaderField(HTTPHeaderName::Location).isEmpty())
return false;
return true;
}
bool ResourceResponse::isMovedPermanently() const
{
return httpStatusCode() == 301;
}
bool ResourceResponse::isFound() const
{
return httpStatusCode() == 302;
}
bool ResourceResponse::isSeeOther() const
{
return httpStatusCode() == 303;
}
bool ResourceResponse::isNotModified() const
{
return httpStatusCode() == 304;
}
bool ResourceResponse::isUnauthorized() const
{
return httpStatusCode() == 401;
}
}
#endif