Mercurial Hosting > luan
annotate src/luan/modules/url/WwwAuthenticate.java @ 1317:c286c1e36b81
add client digest authentication
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 01 Feb 2019 03:46:56 -0700 |
parents | |
children | 27efb1fcbcb5 |
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; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 import luan.lib.parser.Parser; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 import luan.lib.parser.ParseException; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
7 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
8 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 public final class WwwAuthenticate { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 public final String type; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 public final Map<String,String> options = new HashMap<String,String>(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 private final Parser parser; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 public WwwAuthenticate(String header) throws ParseException { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 parser = new Parser(header); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 type = parseType(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 if( !matchSpace() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 throw new ParseException(parser,"space expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 do { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 while( matchSpace() ); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 int start = parser.currentIndex(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 while( parser.inCharRange('a','z') ); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
23 String name = parser.textFrom(start); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
24 if( name.length() == 0 ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 throw new ParseException(parser,"option name not found"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 if( !parser.match('=') ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 throw new ParseException(parser,"'=' expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 if( !parser.match('"') ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
29 throw new ParseException(parser,"'\"' expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 start = parser.currentIndex(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 while( !parser.test('"') ) { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
32 if( !parser.anyChar() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 throw new ParseException(parser,"unexpected end of text"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 String value = parser.textFrom(start); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 if( !parser.match('"') ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 throw new ParseException(parser,"'\"' expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 options.put(name,value); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 while( matchSpace() ); |
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 { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
46 if( parser.match("Basic") ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
47 return "Basic"; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
48 if( parser.match("Digest") ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
49 return "Digest"; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
50 throw new ParseException(parser,"invalid type"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
51 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
52 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
53 private boolean matchSpace() { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
54 return parser.anyOf(" \t\r\n"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
55 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
56 } |