annotate src/luan/modules/url/WwwAuthenticate.java @ 1581:dbf63bef4b86

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 11 Feb 2021 00:51:47 -0700
parents 0160650180bc
children 49236f5ecc32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.modules.url;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.util.Map;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.util.HashMap;
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
5 import java.util.List;
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
6 import java.util.ArrayList;
1402
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
7 import goodjava.parser.Parser;
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
8 import goodjava.parser.ParseException;
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
9 import goodjava.logging.Logger;
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
10 import goodjava.logging.LoggerFactory;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12
1581
Franklin Schmidt <fschmidt@gmail.com>
parents: 1575
diff changeset
13 // https://tools.ietf.org/html/rfc7235#section-4.1
Franklin Schmidt <fschmidt@gmail.com>
parents: 1575
diff changeset
14
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 public final class WwwAuthenticate {
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
16 private static final Logger logger = LoggerFactory.getLogger(WwwAuthenticate.class);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
17
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
18 public static List<WwwAuthenticate> parse(String header) throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
19 Parser parser = new Parser(header);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
20 List<WwwAuthenticate> auths = new ArrayList<WwwAuthenticate>();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
21 do {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
22 auths.add(new WwwAuthenticate(parser,header));
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
23 } while( !parser.endOfInput() );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
24 return auths;
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
25 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
26
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 public final String type;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 public final Map<String,String> options = new HashMap<String,String>();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 private final Parser parser;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
31 private WwwAuthenticate(Parser parser,String header) throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
32 this.parser = parser;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 type = parseType();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 if( !matchSpace() )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 throw new ParseException(parser,"space expected");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 do {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 while( matchSpace() );
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
38 if( !parseOption() )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
39 return;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 } while( parser.match(',') );
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 if( !parser.endOfInput() )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 throw new ParseException(parser,"unexpected input");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 private String parseType() throws ParseException {
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
46 int start = parser.currentIndex();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
47 if( !parser.inCharRange('A','Z') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
48 throw new ParseException(parser,"invalid type");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
49 while( parser.inCharRange('a','z') );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
50 return parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
51 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
52
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
53 private boolean parseOption() throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
54 int start = parser.begin();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
55 while( parser.inCharRange('a','z') );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
56 String name = parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
57 if( name.length() == 0 )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
58 return parser.failure();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
59 if( !parser.match('=') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
60 throw new ParseException(parser,"'=' expected");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
61 if( !parser.match('"') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
62 throw new ParseException(parser,"'\"' expected");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
63 start = parser.currentIndex();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
64 while( !parser.test('"') ) {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
65 if( !parser.anyChar() )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
66 throw new ParseException(parser,"unexpected end of text");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
67 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
68 String value = parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
69 if( !parser.match('"') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
70 throw new ParseException(parser,"'\"' expected");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
71 options.put(name,value);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
72 while( matchSpace() );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
73 return parser.success();
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 private boolean matchSpace() {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 return parser.anyOf(" \t\r\n");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 }