www-authenticate
Version:
Provides the functionality needed for a client to use HTTP Basic or Digest authentication. Also provides primitives for parsing WWW-Authenticate and Authentication_Info headers.
111 lines (104 loc) • 2.76 kB
JavaScript
var ParseAuth= /(\w+)\s+(.*)/ // -> scheme, params
, Separators= /([",=])/
;
function parse_params(header) {
// This parser will definitely fail if there is more than one challenge
var tok, last_tok, _i, _len, key, value;
var state= 0; //0: token,
var m= header.split(Separators)
for (_i = 0, _len = m.length; _i < _len; _i++) {
last_tok= tok;
tok = m[_i];
if (!tok.length) continue;
switch (state) {
case 0: // token
key= tok.trim();
state= 1; // expect equals
continue;
case 1: // expect equals
if ('=' != tok) return 'Equal sign was expected after '+key;
state= 2;
continue;
case 2: // expect value
if ('"' == tok) {
value= '';
state= 3; // expect quoted
continue;
}
else {
this.parms[key]= value= tok.trim();
state= 9; // expect comma or end
continue;
}
case 3: // handling quoted string
if ('"' == tok) {
state= 8; // end quoted
continue;
}
else {
value+= tok;
state= 3; // continue accumulating quoted string
continue;
}
case 8: // end quote encountered
if ('"' == tok) {
// double quoted
value+= '"';
state= 3; // back to quoted string
continue;
}
if (',' == tok) {
this.parms[key]= value;
state= 0;
continue;
}
else {
return 'Unexpected token ('+tok+') after '+value+'"';
}
continue;
case 9: // expect commma
if (',' != tok) return 'Comma expected after '+value;
state= 0;
continue;
}
}
switch (state) { // terminal state
case 0: // Empty or ignoring terminal comma
case 9: // Expecting comma or end of header
return;
case 8: // Last token was end quote
this.parms[key]= value;
return;
default:
return 'Unexpected end of www-authenticate value.';
}
}
function Parse_WWW_Authenticate(to_parse)
{
var m= to_parse.match(ParseAuth);
this.scheme= m[1];
this.parms= {};
var err= this.parse_params(m[2]);
if (err) {
this.scheme= '';
this.parms= {};
this.err= err;
}
}
Parse_Authentication_Info.prototype.parse_params= parse_params;
function Parse_Authentication_Info(to_parse)
{
this.scheme= 'Digest';
this.parms= {};
var err= this.parse_params(to_parse);
if (err) {
this.scheme= '';
this.parms= {};
this.err= err;
}
}
Parse_WWW_Authenticate.prototype.parse_params= parse_params;
module.exports = {
WWW_Authenticate: Parse_WWW_Authenticate,
Authentication_Info: Parse_Authentication_Info
};