Mercurial > hg > monetdb-java
annotate src/main/java/org/monetdb/mcl/net/MonetUrlParser.java @ 918:2543e24eb79a
Add final to more classes.
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Wed, 24 Jul 2024 19:38:33 +0200 (9 months ago) |
parents | 9d21c6e7ed26 |
children | d416e9b6b3d0 |
rev | line source |
---|---|
863
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
1 /* |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
2 * SPDX-License-Identifier: MPL-2.0 |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
3 * |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
4 * This Source Code Form is subject to the terms of the Mozilla Public |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
5 * License, v. 2.0. If a copy of the MPL was not distributed with this |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
7 * |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
8 * Copyright 2024 MonetDB Foundation; |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
9 * Copyright August 2008 - 2023 MonetDB B.V.; |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
10 * Copyright 1997 - July 2008 CWI. |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
11 */ |
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
12 |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
13 package org.monetdb.mcl.net; |
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
14 |
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
15 import java.io.UnsupportedEncodingException; |
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
16 import java.net.URI; |
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
17 import java.net.URISyntaxException; |
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
18 import java.net.URLDecoder; |
808
6b7778153d23
Fully implement Target.buildURL
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
793
diff
changeset
|
19 import java.net.URLEncoder; |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
20 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
21 /** |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
22 * Helper class to keep the URL parsing code separate from the rest of |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
23 * the {@link Target} class. |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
24 */ |
918
2543e24eb79a
Add final to more classes.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
863
diff
changeset
|
25 public final class MonetUrlParser { |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
26 private final Target target; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
27 private final String urlText; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
28 private final URI url; |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
29 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
30 private MonetUrlParser(Target target, String url) throws URISyntaxException { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
31 this.target = target; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
32 this.urlText = url; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
33 // we want to accept monetdb:// but the Java URI parser rejects that. |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
34 switch (url) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
35 case "monetdb:-": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
36 case "monetdbs:-": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
37 throw new URISyntaxException(url, "invalid MonetDB URL"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
38 case "monetdb://": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
39 case "monetdbs://": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
40 url += "-"; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
41 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
42 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
43 this.url = new URI(url); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
44 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
45 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
46 public static void parse(Target target, String url) throws URISyntaxException, ValidationError { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
47 if (url.equals("monetdb://")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
48 // deal with peculiarity of Java's URI parser |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
49 url = "monetdb:///"; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
50 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
51 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
52 target.barrier(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
53 if (url.startsWith("mapi:")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
54 try { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
55 MonetUrlParser parser = new MonetUrlParser(target, url.substring(5)); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
56 parser.parseClassic(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
57 } catch (URISyntaxException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
58 URISyntaxException exc = new URISyntaxException(e.getInput(), e.getReason(), -1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
59 exc.setStackTrace(e.getStackTrace()); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
60 throw exc; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
61 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
62 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
63 MonetUrlParser parser = new MonetUrlParser(target, url); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
64 parser.parseModern(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
65 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
66 target.barrier(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
67 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
68 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
69 public static String percentDecode(String context, String text) throws URISyntaxException { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
70 try { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
71 return URLDecoder.decode(text, "UTF-8"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
72 } catch (UnsupportedEncodingException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
73 throw new IllegalStateException("should be unreachable: UTF-8 unknown??", e); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
74 } catch (IllegalArgumentException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
75 throw new URISyntaxException(text, context + ": invalid percent escape"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
76 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
77 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
78 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
79 public static String percentEncode(String text) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
80 try { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
81 return URLEncoder.encode(text, "UTF-8"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
82 } catch (UnsupportedEncodingException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
83 throw new RuntimeException(e); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
84 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
85 } |
808
6b7778153d23
Fully implement Target.buildURL
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
793
diff
changeset
|
86 |
863
9d21c6e7ed26
Suppress warning: [fallthrough] possible fall-through into case
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
834
diff
changeset
|
87 @SuppressWarnings("fallthrough") |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
88 private void parseModern() throws URISyntaxException, ValidationError { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
89 clearBasic(); |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
90 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
91 String scheme = url.getScheme(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
92 if (scheme == null) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
93 throw new URISyntaxException(urlText, "URL scheme must be monetdb:// or monetdbs://"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
94 switch (scheme) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
95 case "monetdb": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
96 target.setTls(false); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
97 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
98 case "monetdbs": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
99 target.setTls(true); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
100 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
101 default: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
102 throw new URISyntaxException(urlText, "URL scheme must be monetdb:// or monetdbs://"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
103 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
104 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
105 // The built-in getHost and getPort methods do strange things |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
106 // in edge cases such as percent-encoded host names and |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
107 // invalid port numbers |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
108 String authority = url.getAuthority(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
109 String host; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
110 String remainder; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
111 int pos; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
112 if (authority == null) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
113 if (!url.getRawSchemeSpecificPart().startsWith("//")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
114 throw new URISyntaxException(urlText, "expected //"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
115 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
116 host = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
117 remainder = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
118 } else if (authority.equals("-")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
119 host = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
120 remainder = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
121 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
122 if (authority.startsWith("[")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
123 // IPv6 |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
124 pos = authority.indexOf(']'); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
125 if (pos < 0) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
126 throw new URISyntaxException(urlText, "unmatched '['"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
127 host = authority.substring(1, pos); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
128 remainder = authority.substring(pos + 1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
129 } else if ((pos = authority.indexOf(':')) >= 0) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
130 host = authority.substring(0, pos); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
131 remainder = authority.substring(pos); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
132 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
133 host = authority; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
134 remainder = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
135 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
136 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
137 host = Target.unpackHost(host); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
138 target.setHost(host); |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
139 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
140 if (remainder.isEmpty()) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
141 // do nothing |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
142 } else if (remainder.startsWith(":")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
143 String portStr = remainder.substring(1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
144 try { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
145 int port = Integer.parseInt(portStr); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
146 if (port <= 0 || port > 65535) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
147 portStr = null; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
148 } catch (NumberFormatException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
149 portStr = null; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
150 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
151 if (portStr == null) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
152 throw new ValidationError(urlText, "invalid port number"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
153 target.setString(Parameter.PORT, portStr); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
154 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
155 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
156 String path = url.getRawPath(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
157 String[] parts = path.split("/", 4); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
158 // <0: empty before leading slash> / <1: database> / <2: tableschema> / <3: table> / <4: should not exist> |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
159 switch (parts.length) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
160 case 4: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
161 target.setString(Parameter.TABLE, percentDecode(Parameter.TABLE.name, parts[3])); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
162 // fallthrough |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
163 case 3: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
164 target.setString(Parameter.TABLESCHEMA, percentDecode(Parameter.TABLESCHEMA.name, parts[2])); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
165 // fallthrough |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
166 case 2: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
167 target.setString(Parameter.DATABASE, percentDecode(Parameter.DATABASE.name, parts[1])); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
168 case 1: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
169 case 0: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
170 // fallthrough |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
171 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
172 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
173 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
174 final String query = url.getRawQuery(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
175 if (query != null) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
176 final String[] args = query.split("&"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
177 for (int i = 0; i < args.length; i++) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
178 pos = args[i].indexOf('='); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
179 if (pos <= 0) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
180 throw new URISyntaxException(args[i], "invalid key=value pair"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
181 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
182 String key = args[i].substring(0, pos); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
183 key = percentDecode(key, key); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
184 Parameter parm = Parameter.forName(key); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
185 if (parm != null && parm.isCore) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
186 throw new URISyntaxException(key, key + "= is not allowed as a query parameter"); |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
187 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
188 String value = args[i].substring(pos + 1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
189 target.setString(key, percentDecode(key, value)); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
190 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
191 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
192 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
193 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
194 private void parseClassic() throws URISyntaxException, ValidationError { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
195 if (!url.getRawSchemeSpecificPart().startsWith("//")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
196 throw new URISyntaxException(urlText, "expected //"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
197 } |
793
5bfe3357fb1c
Use the new url parser
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
791
diff
changeset
|
198 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
199 String scheme = url.getScheme(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
200 if (scheme == null) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
201 scheme = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
202 switch (scheme) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
203 case "monetdb": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
204 parseClassicAuthorityAndPath(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
205 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
206 case "merovingian": |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
207 String authority = url.getRawAuthority(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
208 // authority must be "proxy" ignore authority and path |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
209 boolean valid = urlText.startsWith("merovingian://proxy?") || urlText.equals("merovingian://proxy"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
210 if (!valid) |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
211 throw new URISyntaxException(urlText, "with mapi:merovingian:, only //proxy is supported"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
212 break; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
213 default: |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
214 throw new URISyntaxException(urlText, "URL scheme must be mapi:monetdb:// or mapi:merovingian://"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
215 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
216 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
217 final String query = url.getRawQuery(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
218 if (query != null) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
219 final String[] args = query.split("&"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
220 for (int i = 0; i < args.length; i++) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
221 String arg = args[i]; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
222 if (arg.startsWith("language=")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
223 String language = arg.substring(9); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
224 target.setString(Parameter.LANGUAGE, language); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
225 } else if (arg.startsWith("database=")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
226 String database = arg.substring(9); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
227 target.setString(Parameter.DATABASE, database); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
228 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
229 // ignore |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
230 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
231 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
232 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
233 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
234 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
235 private void parseClassicAuthorityAndPath() throws URISyntaxException, ValidationError { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
236 clearBasic(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
237 String authority = url.getRawAuthority(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
238 String host; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
239 String portStr; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
240 int pos; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
241 if (authority == null) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
242 host = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
243 portStr = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
244 } else if (authority.indexOf('@') >= 0) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
245 throw new URISyntaxException(urlText, "user@host syntax is not allowed"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
246 } else if ((pos = authority.indexOf(':')) >= 0) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
247 host = authority.substring(0, pos); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
248 portStr = authority.substring(pos + 1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
249 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
250 host = authority; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
251 portStr = ""; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
252 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
253 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
254 if (!portStr.isEmpty()) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
255 int port; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
256 try { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
257 port = Integer.parseInt(portStr); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
258 } catch (NumberFormatException e) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
259 port = -1; |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
260 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
261 if (port <= 0) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
262 throw new ValidationError(urlText, "invalid port number"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
263 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
264 target.setString(Parameter.PORT, portStr); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
265 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
266 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
267 String path = url.getRawPath(); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
268 if (host.isEmpty() && portStr.isEmpty()) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
269 // socket |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
270 target.clear(Parameter.HOST); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
271 target.setString(Parameter.SOCK, path != null ? path : ""); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
272 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
273 // tcp |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
274 target.clear(Parameter.SOCK); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
275 target.setString(Parameter.HOST, host); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
276 if (path == null || path.isEmpty()) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
277 // do nothing |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
278 } else if (!path.startsWith("/")) { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
279 throw new URISyntaxException(urlText, "expect path to start with /"); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
280 } else { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
281 String database = path.substring(1); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
282 target.setString(Parameter.DATABASE, database); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
283 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
284 } |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
285 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
286 |
834
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
287 private void clearBasic() { |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
288 target.clear(Parameter.TLS); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
289 target.clear(Parameter.HOST); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
290 target.clear(Parameter.PORT); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
291 target.clear(Parameter.DATABASE); |
5aa19bbed0d6
Comments and formatting
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
808
diff
changeset
|
292 } |
789
88c5b678e974
URL parser passes the tests.
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
293 } |