annotate 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
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
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 public final class WwwAuthenticate {
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
14 private static final Logger logger = LoggerFactory.getLogger(WwwAuthenticate.class);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
15
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
16 public static List<WwwAuthenticate> parse(String header) throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
17 Parser parser = new Parser(header);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
18 List<WwwAuthenticate> auths = new ArrayList<WwwAuthenticate>();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
19 do {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
20 auths.add(new WwwAuthenticate(parser,header));
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
21 } while( !parser.endOfInput() );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
22 return auths;
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
23 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
24
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 public final String type;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 public final Map<String,String> options = new HashMap<String,String>();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 private final Parser parser;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
29 private WwwAuthenticate(Parser parser,String header) throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
30 this.parser = parser;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 type = parseType();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 if( !matchSpace() )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 throw new ParseException(parser,"space expected");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 do {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 while( matchSpace() );
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
36 if( !parseOption() )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
37 return;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 } while( parser.match(',') );
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 if( !parser.endOfInput() )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 throw new ParseException(parser,"unexpected input");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 private String parseType() throws ParseException {
1575
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
44 int start = parser.currentIndex();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
45 if( !parser.inCharRange('A','Z') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
46 throw new ParseException(parser,"invalid type");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
47 while( parser.inCharRange('a','z') );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
48 return parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
49 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
50
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
51 private boolean parseOption() throws ParseException {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
52 int start = parser.begin();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
53 while( parser.inCharRange('a','z') );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
54 String name = parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
55 if( name.length() == 0 )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
56 return parser.failure();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
57 if( !parser.match('=') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
58 throw new ParseException(parser,"'=' expected");
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 start = parser.currentIndex();
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
62 while( !parser.test('"') ) {
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
63 if( !parser.anyChar() )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
64 throw new ParseException(parser,"unexpected end of text");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
65 }
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
66 String value = parser.textFrom(start);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
67 if( !parser.match('"') )
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
68 throw new ParseException(parser,"'\"' expected");
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
69 options.put(name,value);
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
70 while( matchSpace() );
0160650180bc better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
71 return parser.success();
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 private boolean matchSpace() {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 return parser.anyOf(" \t\r\n");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 }