You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.5 KiB
169 lines
4.5 KiB
/* |
|
* Copyright 2014 A.C.R. Development |
|
*/ |
|
package acr.browser.lightning; |
|
|
|
|
|
|
|
import static android.util.Patterns.GOOD_IRI_CHAR; |
|
|
|
import java.util.Locale; |
|
import java.util.regex.Matcher; |
|
import java.util.regex.Pattern; |
|
|
|
|
|
/** |
|
* {@hide} |
|
* |
|
* Web Address Parser |
|
* |
|
* This is called WebAddress, rather than URL or URI, because it |
|
* attempts to parse the stuff that a user will actually type into a |
|
* browser address widget. |
|
* |
|
* Unlike java.net.uri, this parser will not choke on URIs missing |
|
* schemes. It will only throw a ParseException if the input is |
|
* really hosed. |
|
* |
|
* If given an https scheme but no port, fills in port |
|
* |
|
*/ |
|
public class WebAddress { |
|
|
|
private String mScheme; |
|
private String mHost; |
|
private int mPort; |
|
private String mPath; |
|
private String mAuthInfo; |
|
|
|
static final int MATCH_GROUP_SCHEME = 1; |
|
static final int MATCH_GROUP_AUTHORITY = 2; |
|
static final int MATCH_GROUP_HOST = 3; |
|
static final int MATCH_GROUP_PORT = 4; |
|
static final int MATCH_GROUP_PATH = 5; |
|
|
|
static Pattern sAddressPattern = Pattern.compile( |
|
/* scheme */ "(?:(http|https|file)\\:\\/\\/)?" + |
|
/* authority */ "(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" + |
|
/* host */ "([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" + |
|
/* port */ "(?:\\:([0-9]*))?" + |
|
/* path */ "(\\/?[^#]*)?" + |
|
/* anchor */ ".*", Pattern.CASE_INSENSITIVE); |
|
|
|
/** parses given uriString. |
|
* @throws Exception */ |
|
public WebAddress(String address) throws Exception { |
|
if (address == null) { |
|
throw new NullPointerException(); |
|
} |
|
|
|
// android.util.Log.d(LOGTAG, "WebAddress: " + address); |
|
|
|
mScheme = ""; |
|
mHost = ""; |
|
mPort = -1; |
|
mPath = "/"; |
|
mAuthInfo = ""; |
|
|
|
Matcher m = sAddressPattern.matcher(address); |
|
String t; |
|
if (m.matches()) { |
|
t = m.group(MATCH_GROUP_SCHEME); |
|
if (t != null) mScheme = t.toLowerCase(Locale.ROOT); |
|
t = m.group(MATCH_GROUP_AUTHORITY); |
|
if (t != null) mAuthInfo = t; |
|
t = m.group(MATCH_GROUP_HOST); |
|
if (t != null) mHost = t; |
|
t = m.group(MATCH_GROUP_PORT); |
|
if (t != null && t.length() > 0) { |
|
// The ':' character is not returned by the regex. |
|
try { |
|
mPort = Integer.parseInt(t); |
|
} catch (NumberFormatException ex) { |
|
throw new Exception(); |
|
} |
|
} |
|
t = m.group(MATCH_GROUP_PATH); |
|
if (t != null && t.length() > 0) { |
|
/* handle busted myspace frontpage redirect with |
|
missing initial "/" */ |
|
if (t.charAt(0) == '/') { |
|
mPath = t; |
|
} else { |
|
mPath = "/" + t; |
|
} |
|
} |
|
|
|
} else { |
|
// nothing found... outa here |
|
throw new Exception(); |
|
} |
|
|
|
/* Get port from scheme or scheme from port, if necessary and |
|
possible */ |
|
if (mPort == 443 && mScheme.equals("")) { |
|
mScheme = "https"; |
|
} else if (mPort == -1) { |
|
if (mScheme.equals("https")) |
|
mPort = 443; |
|
else |
|
mPort = 80; // default |
|
} |
|
if (mScheme.equals("")) mScheme = "http"; |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
String port = ""; |
|
if ((mPort != 443 && mScheme.equals("https")) || |
|
(mPort != 80 && mScheme.equals("http"))) { |
|
port = ":" + Integer.toString(mPort); |
|
} |
|
String authInfo = ""; |
|
if (mAuthInfo.length() > 0) { |
|
authInfo = mAuthInfo + "@"; |
|
} |
|
|
|
return mScheme + "://" + authInfo + mHost + port + mPath; |
|
} |
|
|
|
public void setScheme(String scheme) { |
|
mScheme = scheme; |
|
} |
|
|
|
public String getScheme() { |
|
return mScheme; |
|
} |
|
|
|
public void setHost(String host) { |
|
mHost = host; |
|
} |
|
|
|
public String getHost() { |
|
return mHost; |
|
} |
|
|
|
public void setPort(int port) { |
|
mPort = port; |
|
} |
|
|
|
public int getPort() { |
|
return mPort; |
|
} |
|
|
|
public void setPath(String path) { |
|
mPath = path; |
|
} |
|
|
|
public String getPath() { |
|
return mPath; |
|
} |
|
|
|
public void setAuthInfo(String authInfo) { |
|
mAuthInfo = authInfo; |
|
} |
|
|
|
public String getAuthInfo() { |
|
return mAuthInfo; |
|
} |
|
} |