AuthenticationChallengeCurl.cpp [plain text]
#include "config.h"
#include "AuthenticationChallenge.h"
#if USE(CURL)
#include "CurlContext.h"
#include "CurlResponse.h"
#include "ResourceError.h"
namespace WebCore {
AuthenticationChallenge::AuthenticationChallenge(const CurlResponse& curlResponse, unsigned previousFailureCount, const ResourceResponse& response, AuthenticationClient* client)
: AuthenticationChallengeBase(protectionSpaceFromHandle(curlResponse, response), Credential(), previousFailureCount, response, ResourceError())
, m_authenticationClient(client)
{
}
ProtectionSpaceServerType AuthenticationChallenge::protectionSpaceServerTypeFromURI(const URL& url)
{
if (url.protocolIs("https"))
return ProtectionSpaceServerHTTPS;
if (url.protocolIs("http"))
return ProtectionSpaceServerHTTP;
if (url.protocolIs("ftp"))
return ProtectionSpaceServerFTP;
return ProtectionSpaceServerHTTP;
}
ProtectionSpace AuthenticationChallenge::protectionSpaceFromHandle(const CurlResponse& curlResponse, const ResourceResponse& response)
{
auto port = curlResponse.connectPort;
auto availableHttpAuth = curlResponse.availableHttpAuth;
ProtectionSpaceAuthenticationScheme scheme = ProtectionSpaceAuthenticationSchemeUnknown;
if (availableHttpAuth & CURLAUTH_BASIC)
scheme = ProtectionSpaceAuthenticationSchemeHTTPBasic;
if (availableHttpAuth & CURLAUTH_DIGEST)
scheme = ProtectionSpaceAuthenticationSchemeHTTPDigest;
if (availableHttpAuth & CURLAUTH_NEGOTIATE)
scheme = ProtectionSpaceAuthenticationSchemeNegotiate;
if (availableHttpAuth & CURLAUTH_NTLM)
scheme = ProtectionSpaceAuthenticationSchemeNTLM;
String realm;
const String realmString("realm=");
auto authHeader = response.httpHeaderField(String("www-authenticate"));
auto realmPos = authHeader.findIgnoringASCIICase(realmString);
if (realmPos != notFound) {
realm = authHeader.substring(realmPos + realmString.length());
realm = realm.left(realm.find(','));
removeLeadingAndTrailingQuotes(realm);
}
return ProtectionSpace(response.url().host(), static_cast<int>(port), protectionSpaceServerTypeFromURI(response.url()), realm, scheme);
}
void AuthenticationChallenge::removeLeadingAndTrailingQuotes(String& value)
{
auto length = value.length();
if (value.startsWith('"') && value.endsWith('"') && length > 1)
value = value.substring(1, length - 2);
}
}
#endif