Mercurial Hosting > luan
diff src/luan/modules/url/WwwAuthenticate.java @ 1575:0160650180bc
better http authentication
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 27 Jan 2021 15:31:26 -0700 |
parents | 27efb1fcbcb5 |
children | dbf63bef4b86 |
line wrap: on
line diff
--- a/src/luan/modules/url/WwwAuthenticate.java Sun Dec 20 13:17:27 2020 -0700 +++ b/src/luan/modules/url/WwwAuthenticate.java Wed Jan 27 15:31:26 2021 -0700 @@ -2,52 +2,73 @@ import java.util.Map; import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; import goodjava.parser.Parser; import goodjava.parser.ParseException; +import goodjava.logging.Logger; +import goodjava.logging.LoggerFactory; public final class WwwAuthenticate { + private static final Logger logger = LoggerFactory.getLogger(WwwAuthenticate.class); + + public static List<WwwAuthenticate> parse(String header) throws ParseException { + Parser parser = new Parser(header); + List<WwwAuthenticate> auths = new ArrayList<WwwAuthenticate>(); + do { + auths.add(new WwwAuthenticate(parser,header)); + } while( !parser.endOfInput() ); + return auths; + } + public final String type; public final Map<String,String> options = new HashMap<String,String>(); private final Parser parser; - public WwwAuthenticate(String header) throws ParseException { - parser = new Parser(header); + private WwwAuthenticate(Parser parser,String header) throws ParseException { + this.parser = parser; type = parseType(); if( !matchSpace() ) throw new ParseException(parser,"space expected"); do { while( matchSpace() ); - int start = parser.currentIndex(); - while( parser.inCharRange('a','z') ); - String name = parser.textFrom(start); - if( name.length() == 0 ) - throw new ParseException(parser,"option name not found"); - if( !parser.match('=') ) - throw new ParseException(parser,"'=' expected"); - if( !parser.match('"') ) - throw new ParseException(parser,"'\"' expected"); - start = parser.currentIndex(); - while( !parser.test('"') ) { - if( !parser.anyChar() ) - throw new ParseException(parser,"unexpected end of text"); - } - String value = parser.textFrom(start); - if( !parser.match('"') ) - throw new ParseException(parser,"'\"' expected"); - options.put(name,value); - while( matchSpace() ); + if( !parseOption() ) + return; } while( parser.match(',') ); if( !parser.endOfInput() ) throw new ParseException(parser,"unexpected input"); } private String parseType() throws ParseException { - if( parser.match("Basic") ) - return "Basic"; - if( parser.match("Digest") ) - return "Digest"; - throw new ParseException(parser,"invalid type"); + int start = parser.currentIndex(); + if( !parser.inCharRange('A','Z') ) + throw new ParseException(parser,"invalid type"); + while( parser.inCharRange('a','z') ); + return parser.textFrom(start); + } + + private boolean parseOption() throws ParseException { + int start = parser.begin(); + while( parser.inCharRange('a','z') ); + String name = parser.textFrom(start); + if( name.length() == 0 ) + return parser.failure(); + if( !parser.match('=') ) + throw new ParseException(parser,"'=' expected"); + if( !parser.match('"') ) + throw new ParseException(parser,"'\"' expected"); + start = parser.currentIndex(); + while( !parser.test('"') ) { + if( !parser.anyChar() ) + throw new ParseException(parser,"unexpected end of text"); + } + String value = parser.textFrom(start); + if( !parser.match('"') ) + throw new ParseException(parser,"'\"' expected"); + options.put(name,value); + while( matchSpace() ); + return parser.success(); } private boolean matchSpace() {