Bug 1122194 - Follow method validation rules when constructing Request. r=baku,bkelly

--HG--
extra : amend_source : 78950befd29e5aff54956b3399993ade769a21c5
extra : transplant_source : c%B3%E0%87%E7Zdx%03%A6%AA%0A%1C%5E%A8%EF%95%FF%3D%86
This commit is contained in:
Nikhil Marathe 2015-01-15 12:11:12 -08:00
parent db8e9e1cb3
commit 610be35159
2 changed files with 40 additions and 12 deletions

View File

@ -151,23 +151,35 @@ Request::Constructor(const GlobalObject& aGlobal,
request->SetCredentialsMode(credentials);
}
// Request constructor step 14.
if (aInit.mMethod.WasPassed()) {
nsCString method = aInit.mMethod.Value();
ToLowerCase(method);
nsAutoCString method(aInit.mMethod.Value());
nsAutoCString upperCaseMethod = method;
ToUpperCase(upperCaseMethod);
if (!method.EqualsASCII("options") &&
!method.EqualsASCII("get") &&
!method.EqualsASCII("head") &&
!method.EqualsASCII("post") &&
!method.EqualsASCII("put") &&
!method.EqualsASCII("delete")) {
// Step 14.1. Disallow forbidden methods, and anything that is not a HTTP
// token, since HTTP states that Method may be any of the defined values or
// a token (extension method).
if (upperCaseMethod.EqualsLiteral("CONNECT") ||
upperCaseMethod.EqualsLiteral("TRACE") ||
upperCaseMethod.EqualsLiteral("TRACK") ||
!NS_IsValidHTTPToken(method)) {
NS_ConvertUTF8toUTF16 label(method);
aRv.ThrowTypeError(MSG_INVALID_REQUEST_METHOD, &label);
return nullptr;
}
ToUpperCase(method);
request->SetMethod(method);
// Step 14.2
if (upperCaseMethod.EqualsLiteral("DELETE") ||
upperCaseMethod.EqualsLiteral("GET") ||
upperCaseMethod.EqualsLiteral("HEAD") ||
upperCaseMethod.EqualsLiteral("POST") ||
upperCaseMethod.EqualsLiteral("PUT") ||
upperCaseMethod.EqualsLiteral("OPTIONS")) {
request->SetMethod(upperCaseMethod);
} else {
request->SetMethod(method);
}
}
nsRefPtr<InternalHeaders> requestHeaders = request->Headers();

View File

@ -78,17 +78,33 @@ function testBug1109574() {
}
function testMethod() {
var allowed = ["delete", "get", "head", "options", "post", "put"];
// These get normalized.
var allowed = ["delete", "get", "head", "options", "post", "put" ];
for (var i = 0; i < allowed.length; ++i) {
try {
var r = new Request("", { method: allowed[i] });
ok(true, "Method " + allowed[i] + " should be allowed");
is(r.method, allowed[i].toUpperCase(),
"Standard HTTP method " + allowed[i] + " should be normalized");
} catch(e) {
ok(false, "Method " + allowed[i] + " should be allowed");
}
}
var forbidden = ["aardvark", "connect", "trace", "track"];
var allowed = [ "pAtCh", "foo" ];
for (var i = 0; i < allowed.length; ++i) {
try {
var r = new Request("", { method: allowed[i] });
ok(true, "Method " + allowed[i] + " should be allowed");
is(r.method, allowed[i],
"Non-standard but valid HTTP method " + allowed[i] +
" should not be normalized");
} catch(e) {
ok(false, "Method " + allowed[i] + " should be allowed");
}
}
var forbidden = ["connect", "trace", "track", "<invalid token??"];
for (var i = 0; i < forbidden.length; ++i) {
try {
var r = new Request("", { method: forbidden[i] });