Mercurial Hosting > luan
diff src/org/eclipse/jetty/http/HttpURI.java @ 1018:4dc1e1a18661
remove HttpSchemes
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 24 Oct 2016 05:37:24 -0600 |
parents | 3428c60d7cfc |
children |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/http/HttpURI.java Mon Oct 24 01:56:08 2016 -0600 +++ b/src/org/eclipse/jetty/http/HttpURI.java Mon Oct 24 05:37:24 2016 -0600 @@ -47,725 +47,725 @@ */ public class HttpURI { - private static final byte[] __empty={}; - private final static int - START=0, - AUTH_OR_PATH=1, - SCHEME_OR_PATH=2, - AUTH=4, - IPV6=5, - PORT=6, - PATH=7, - PARAM=8, - QUERY=9, - ASTERISK=10; + private static final byte[] __empty={}; + private final static int + START=0, + AUTH_OR_PATH=1, + SCHEME_OR_PATH=2, + AUTH=4, + IPV6=5, + PORT=6, + PATH=7, + PARAM=8, + QUERY=9, + ASTERISK=10; - boolean _partial=false; - byte[] _raw=__empty; - String _rawString; - int _scheme; - int _authority; - int _host; - int _port; - int _portValue; - int _path; - int _param; - int _query; - int _fragment; - int _end; - boolean _encoded=false; + boolean _partial=false; + byte[] _raw=__empty; + String _rawString; + int _scheme; + int _authority; + int _host; + int _port; + int _portValue; + int _path; + int _param; + int _query; + int _fragment; + int _end; + boolean _encoded=false; - final Utf8StringBuilder _utf8b = new Utf8StringBuilder(64); + final Utf8StringBuilder _utf8b = new Utf8StringBuilder(64); - public HttpURI() - { + public HttpURI() + { - } + } - /* ------------------------------------------------------------ */ - /** - * @param parsePartialAuth If True, parse auth without prior scheme, else treat all URIs starting with / as paths - */ - public HttpURI(boolean parsePartialAuth) - { - _partial=parsePartialAuth; - } + /* ------------------------------------------------------------ */ + /** + * @param parsePartialAuth If True, parse auth without prior scheme, else treat all URIs starting with / as paths + */ + public HttpURI(boolean parsePartialAuth) + { + _partial=parsePartialAuth; + } - public HttpURI(String raw) - { - _rawString=raw; - byte[] b; - try - { - b = raw.getBytes(StringUtil.__UTF8); - } - catch (UnsupportedEncodingException e) - { - throw new RuntimeException(e.getMessage()); - } - parse(b,0,b.length); - } + public HttpURI(String raw) + { + _rawString=raw; + byte[] b; + try + { + b = raw.getBytes(StringUtil.__UTF8); + } + catch (UnsupportedEncodingException e) + { + throw new RuntimeException(e.getMessage()); + } + parse(b,0,b.length); + } - public HttpURI(byte[] raw,int offset, int length) - { - parse2(raw,offset,length); - } - - public HttpURI(URI uri) - { - parse(uri.toASCIIString()); - } + public HttpURI(byte[] raw,int offset, int length) + { + parse2(raw,offset,length); + } + + public HttpURI(URI uri) + { + parse(uri.toASCIIString()); + } - public void parse(String raw) - { - byte[] b = raw.getBytes(); - parse2(b,0,b.length); - _rawString=raw; - } + public void parse(String raw) + { + byte[] b = raw.getBytes(); + parse2(b,0,b.length); + _rawString=raw; + } - public void parse(byte[] raw,int offset, int length) - { - _rawString=null; - parse2(raw,offset,length); - } + public void parse(byte[] raw,int offset, int length) + { + _rawString=null; + parse2(raw,offset,length); + } - public void parseConnect(byte[] raw,int offset, int length) - { - _rawString=null; - _encoded=false; - _raw=raw; - int i=offset; - int e=offset+length; - int state=AUTH; - _end=offset+length; - _scheme=offset; - _authority=offset; - _host=offset; - _port=_end; - _portValue=-1; - _path=_end; - _param=_end; - _query=_end; - _fragment=_end; + public void parseConnect(byte[] raw,int offset, int length) + { + _rawString=null; + _encoded=false; + _raw=raw; + int i=offset; + int e=offset+length; + int state=AUTH; + _end=offset+length; + _scheme=offset; + _authority=offset; + _host=offset; + _port=_end; + _portValue=-1; + _path=_end; + _param=_end; + _query=_end; + _fragment=_end; - loop: while (i<e) - { - char c=(char)(0xff&_raw[i]); - int s=i++; + loop: while (i<e) + { + char c=(char)(0xff&_raw[i]); + int s=i++; - switch (state) - { - case AUTH: - { - switch (c) - { - case ':': - { - _port = s; - break loop; - } - case '[': - { - state = IPV6; - break; - } - } - continue; - } + switch (state) + { + case AUTH: + { + switch (c) + { + case ':': + { + _port = s; + break loop; + } + case '[': + { + state = IPV6; + break; + } + } + continue; + } - case IPV6: - { - switch (c) - { - case '/': - { - throw new IllegalArgumentException("No closing ']' for " + StringUtil.toString(_raw,offset,length,URIUtil.__CHARSET)); - } - case ']': - { - state = AUTH; - break; - } - } + case IPV6: + { + switch (c) + { + case '/': + { + throw new IllegalArgumentException("No closing ']' for " + StringUtil.toString(_raw,offset,length,URIUtil.__CHARSET)); + } + case ']': + { + state = AUTH; + break; + } + } - continue; - } - } - } + continue; + } + } + } - if (_port<_path) - _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10); - else - throw new IllegalArgumentException("No port"); - _path=offset; - } + if (_port<_path) + _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10); + else + throw new IllegalArgumentException("No port"); + _path=offset; + } - private void parse2(byte[] raw,int offset, int length) - { - _encoded=false; - _raw=raw; - int i=offset; - int e=offset+length; - int state=START; - int m=offset; - _end=offset+length; - _scheme=offset; - _authority=offset; - _host=offset; - _port=offset; - _portValue=-1; - _path=offset; - _param=_end; - _query=_end; - _fragment=_end; - while (i<e) - { - char c=(char)(0xff&_raw[i]); - int s=i++; + private void parse2(byte[] raw,int offset, int length) + { + _encoded=false; + _raw=raw; + int i=offset; + int e=offset+length; + int state=START; + int m=offset; + _end=offset+length; + _scheme=offset; + _authority=offset; + _host=offset; + _port=offset; + _portValue=-1; + _path=offset; + _param=_end; + _query=_end; + _fragment=_end; + while (i<e) + { + char c=(char)(0xff&_raw[i]); + int s=i++; - state: switch (state) - { - case START: - { - m=s; - switch(c) - { - case '/': - state=AUTH_OR_PATH; - break; - case ';': - _param=s; - state=PARAM; - break; - case '?': - _param=s; - _query=s; - state=QUERY; - break; - case '#': - _param=s; - _query=s; - _fragment=s; - break; - case '*': - _path=s; - state=ASTERISK; - break; + state: switch (state) + { + case START: + { + m=s; + switch(c) + { + case '/': + state=AUTH_OR_PATH; + break; + case ';': + _param=s; + state=PARAM; + break; + case '?': + _param=s; + _query=s; + state=QUERY; + break; + case '#': + _param=s; + _query=s; + _fragment=s; + break; + case '*': + _path=s; + state=ASTERISK; + break; - default: - state=SCHEME_OR_PATH; - } + default: + state=SCHEME_OR_PATH; + } - continue; - } + continue; + } - case AUTH_OR_PATH: - { - if ((_partial||_scheme!=_authority) && c=='/') - { - _host=i; - _port=_end; - _path=_end; - state=AUTH; - } - else if (c==';' || c=='?' || c=='#') - { - i--; - state=PATH; - } - else - { - _host=m; - _port=m; - state=PATH; - } - continue; - } + case AUTH_OR_PATH: + { + if ((_partial||_scheme!=_authority) && c=='/') + { + _host=i; + _port=_end; + _path=_end; + state=AUTH; + } + else if (c==';' || c=='?' || c=='#') + { + i--; + state=PATH; + } + else + { + _host=m; + _port=m; + state=PATH; + } + continue; + } - case SCHEME_OR_PATH: - { - // short cut for http and https - if (length>6 && c=='t') - { - if (_raw[offset+3]==':') - { - s=offset+3; - i=offset+4; - c=':'; - } - else if (_raw[offset+4]==':') - { - s=offset+4; - i=offset+5; - c=':'; - } - else if (_raw[offset+5]==':') - { - s=offset+5; - i=offset+6; - c=':'; - } - } + case SCHEME_OR_PATH: + { + // short cut for http and https + if (length>6 && c=='t') + { + if (_raw[offset+3]==':') + { + s=offset+3; + i=offset+4; + c=':'; + } + else if (_raw[offset+4]==':') + { + s=offset+4; + i=offset+5; + c=':'; + } + else if (_raw[offset+5]==':') + { + s=offset+5; + i=offset+6; + c=':'; + } + } - switch (c) - { - case ':': - { - m = i++; - _authority = m; - _path = m; - c = (char)(0xff & _raw[i]); - if (c == '/') - state = AUTH_OR_PATH; - else - { - _host = m; - _port = m; - state = PATH; - } - break; - } + switch (c) + { + case ':': + { + m = i++; + _authority = m; + _path = m; + c = (char)(0xff & _raw[i]); + if (c == '/') + state = AUTH_OR_PATH; + else + { + _host = m; + _port = m; + state = PATH; + } + break; + } - case '/': - { - state = PATH; - break; - } + case '/': + { + state = PATH; + break; + } - case ';': - { - _param = s; - state = PARAM; - break; - } + case ';': + { + _param = s; + state = PARAM; + break; + } - case '?': - { - _param = s; - _query = s; - state = QUERY; - break; - } + case '?': + { + _param = s; + _query = s; + state = QUERY; + break; + } - case '#': - { - _param = s; - _query = s; - _fragment = s; - break; - } - } - continue; - } + case '#': + { + _param = s; + _query = s; + _fragment = s; + break; + } + } + continue; + } - case AUTH: - { - switch (c) - { + case AUTH: + { + switch (c) + { - case '/': - { - m = s; - _path = m; - _port = _path; - state = PATH; - break; - } - case '@': - { - _host = i; - break; - } - case ':': - { - _port = s; - state = PORT; - break; - } - case '[': - { - state = IPV6; - break; - } - } - continue; - } + case '/': + { + m = s; + _path = m; + _port = _path; + state = PATH; + break; + } + case '@': + { + _host = i; + break; + } + case ':': + { + _port = s; + state = PORT; + break; + } + case '[': + { + state = IPV6; + break; + } + } + continue; + } - case IPV6: - { - switch (c) - { - case '/': - { - throw new IllegalArgumentException("No closing ']' for " + StringUtil.toString(_raw,offset,length,URIUtil.__CHARSET)); - } - case ']': - { - state = AUTH; - break; - } - } + case IPV6: + { + switch (c) + { + case '/': + { + throw new IllegalArgumentException("No closing ']' for " + StringUtil.toString(_raw,offset,length,URIUtil.__CHARSET)); + } + case ']': + { + state = AUTH; + break; + } + } - continue; - } + continue; + } - case PORT: - { - if (c=='/') - { - m=s; - _path=m; - if (_port<=_authority) - _port=_path; - state=PATH; - } - continue; - } + case PORT: + { + if (c=='/') + { + m=s; + _path=m; + if (_port<=_authority) + _port=_path; + state=PATH; + } + continue; + } - case PATH: - { - switch (c) - { - case ';': - { - _param = s; - state = PARAM; - break; - } - case '?': - { - _param = s; - _query = s; - state = QUERY; - break; - } - case '#': - { - _param = s; - _query = s; - _fragment = s; - break state; - } - case '%': - { - _encoded=true; - } - } - continue; - } + case PATH: + { + switch (c) + { + case ';': + { + _param = s; + state = PARAM; + break; + } + case '?': + { + _param = s; + _query = s; + state = QUERY; + break; + } + case '#': + { + _param = s; + _query = s; + _fragment = s; + break state; + } + case '%': + { + _encoded=true; + } + } + continue; + } - case PARAM: - { - switch (c) - { - case '?': - { - _query = s; - state = QUERY; - break; - } - case '#': - { - _query = s; - _fragment = s; - break state; - } - } - continue; - } + case PARAM: + { + switch (c) + { + case '?': + { + _query = s; + state = QUERY; + break; + } + case '#': + { + _query = s; + _fragment = s; + break state; + } + } + continue; + } - case QUERY: - { - if (c=='#') - { - _fragment=s; - break state; - } - continue; - } + case QUERY: + { + if (c=='#') + { + _fragment=s; + break state; + } + continue; + } - case ASTERISK: - { - throw new IllegalArgumentException("only '*'"); - } - } - } + case ASTERISK: + { + throw new IllegalArgumentException("only '*'"); + } + } + } - if (_port<_path) - _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10); - } + if (_port<_path) + _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10); + } - private String toUtf8String(int offset,int length) - { - _utf8b.reset(); - _utf8b.append(_raw,offset,length); - return _utf8b.toString(); - } + private String toUtf8String(int offset,int length) + { + _utf8b.reset(); + _utf8b.append(_raw,offset,length); + return _utf8b.toString(); + } - public String getScheme() - { - if (_scheme==_authority) - return null; - int l=_authority-_scheme; - if (l==5 && - _raw[_scheme]=='h' && - _raw[_scheme+1]=='t' && - _raw[_scheme+2]=='t' && - _raw[_scheme+3]=='p' ) - return HttpSchemes.HTTP; - if (l==6 && - _raw[_scheme]=='h' && - _raw[_scheme+1]=='t' && - _raw[_scheme+2]=='t' && - _raw[_scheme+3]=='p' && - _raw[_scheme+4]=='s' ) - return HttpSchemes.HTTPS; + public String getScheme() + { + if (_scheme==_authority) + return null; + int l=_authority-_scheme; + if (l==5 && + _raw[_scheme]=='h' && + _raw[_scheme+1]=='t' && + _raw[_scheme+2]=='t' && + _raw[_scheme+3]=='p' ) + return "http"; + if (l==6 && + _raw[_scheme]=='h' && + _raw[_scheme+1]=='t' && + _raw[_scheme+2]=='t' && + _raw[_scheme+3]=='p' && + _raw[_scheme+4]=='s' ) + return "https"; - return toUtf8String(_scheme,_authority-_scheme-1); - } + return toUtf8String(_scheme,_authority-_scheme-1); + } - public String getAuthority() - { - if (_authority==_path) - return null; - return toUtf8String(_authority,_path-_authority); - } + public String getAuthority() + { + if (_authority==_path) + return null; + return toUtf8String(_authority,_path-_authority); + } - public String getHost() - { - if (_host==_port) - return null; - return toUtf8String(_host,_port-_host); - } + public String getHost() + { + if (_host==_port) + return null; + return toUtf8String(_host,_port-_host); + } - public int getPort() - { - return _portValue; - } + public int getPort() + { + return _portValue; + } - public String getPath() - { - if (_path==_param) - return null; - return toUtf8String(_path,_param-_path); - } + public String getPath() + { + if (_path==_param) + return null; + return toUtf8String(_path,_param-_path); + } - public String getDecodedPath() - { - if (_path==_param) - return null; + public String getDecodedPath() + { + if (_path==_param) + return null; - int length = _param-_path; - boolean decoding=false; + int length = _param-_path; + boolean decoding=false; - for (int i=_path;i<_param;i++) - { - byte b = _raw[i]; + for (int i=_path;i<_param;i++) + { + byte b = _raw[i]; - if (b=='%') - { - if (!decoding) - { - _utf8b.reset(); - _utf8b.append(_raw,_path,i-_path); - decoding=true; - } - - if ((i+2)>=_param) - throw new IllegalArgumentException("Bad % encoding: "+this); - if (_raw[i+1]=='u') - { - if ((i+5)>=_param) - throw new IllegalArgumentException("Bad %u encoding: "+this); - try - { - String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16))); - _utf8b.getStringBuilder().append(unicode); - i+=5; - } - catch(Exception e) - { - throw new RuntimeException(e); - } - } - else - { - b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16)); - _utf8b.append(b); - i+=2; - } - continue; - } - else if (decoding) - { - _utf8b.append(b); - } - } + if (b=='%') + { + if (!decoding) + { + _utf8b.reset(); + _utf8b.append(_raw,_path,i-_path); + decoding=true; + } + + if ((i+2)>=_param) + throw new IllegalArgumentException("Bad % encoding: "+this); + if (_raw[i+1]=='u') + { + if ((i+5)>=_param) + throw new IllegalArgumentException("Bad %u encoding: "+this); + try + { + String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16))); + _utf8b.getStringBuilder().append(unicode); + i+=5; + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } + else + { + b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16)); + _utf8b.append(b); + i+=2; + } + continue; + } + else if (decoding) + { + _utf8b.append(b); + } + } - if (!decoding) - return toUtf8String(_path,length); - return _utf8b.toString(); - } - - public String getDecodedPath(String encoding) - { - if (_path==_param) - return null; + if (!decoding) + return toUtf8String(_path,length); + return _utf8b.toString(); + } + + public String getDecodedPath(String encoding) + { + if (_path==_param) + return null; - int length = _param-_path; - byte[] bytes=null; - int n=0; + int length = _param-_path; + byte[] bytes=null; + int n=0; - for (int i=_path;i<_param;i++) - { - byte b = _raw[i]; + for (int i=_path;i<_param;i++) + { + byte b = _raw[i]; - if (b=='%') - { - if (bytes==null) - { - bytes=new byte[length]; - System.arraycopy(_raw,_path,bytes,0,n); - } - - if ((i+2)>=_param) - throw new IllegalArgumentException("Bad % encoding: "+this); - if (_raw[i+1]=='u') - { - if ((i+5)>=_param) - throw new IllegalArgumentException("Bad %u encoding: "+this); + if (b=='%') + { + if (bytes==null) + { + bytes=new byte[length]; + System.arraycopy(_raw,_path,bytes,0,n); + } + + if ((i+2)>=_param) + throw new IllegalArgumentException("Bad % encoding: "+this); + if (_raw[i+1]=='u') + { + if ((i+5)>=_param) + throw new IllegalArgumentException("Bad %u encoding: "+this); - try - { - String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16))); - byte[] encoded = unicode.getBytes(encoding); - System.arraycopy(encoded,0,bytes,n,encoded.length); - n+=encoded.length; - i+=5; - } - catch(Exception e) - { - throw new RuntimeException(e); - } - } - else - { - b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16)); - bytes[n++]=b; - i+=2; - } - continue; - } - else if (bytes==null) - { - n++; - continue; - } + try + { + String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16))); + byte[] encoded = unicode.getBytes(encoding); + System.arraycopy(encoded,0,bytes,n,encoded.length); + n+=encoded.length; + i+=5; + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } + else + { + b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16)); + bytes[n++]=b; + i+=2; + } + continue; + } + else if (bytes==null) + { + n++; + continue; + } - bytes[n++]=b; - } + bytes[n++]=b; + } - if (bytes==null) - return StringUtil.toString(_raw,_path,_param-_path,encoding); + if (bytes==null) + return StringUtil.toString(_raw,_path,_param-_path,encoding); - return StringUtil.toString(bytes,0,n,encoding); - } - - - - - + return StringUtil.toString(bytes,0,n,encoding); + } + + + + + - public String getPathAndParam() - { - if (_path==_query) - return null; - return toUtf8String(_path,_query-_path); - } + public String getPathAndParam() + { + if (_path==_query) + return null; + return toUtf8String(_path,_query-_path); + } - public String getCompletePath() - { - if (_path==_end) - return null; - return toUtf8String(_path,_end-_path); - } + public String getCompletePath() + { + if (_path==_end) + return null; + return toUtf8String(_path,_end-_path); + } - public String getParam() - { - if (_param==_query) - return null; - return toUtf8String(_param+1,_query-_param-1); - } + public String getParam() + { + if (_param==_query) + return null; + return toUtf8String(_param+1,_query-_param-1); + } - public String getQuery() - { - if (_query==_fragment) - return null; - return toUtf8String(_query+1,_fragment-_query-1); - } + public String getQuery() + { + if (_query==_fragment) + return null; + return toUtf8String(_query+1,_fragment-_query-1); + } - public String getQuery(String encoding) - { - if (_query==_fragment) - return null; - return StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding); - } + public String getQuery(String encoding) + { + if (_query==_fragment) + return null; + return StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding); + } - public boolean hasQuery() - { - return (_fragment>_query); - } + public boolean hasQuery() + { + return (_fragment>_query); + } - public String getFragment() - { - if (_fragment==_end) - return null; - return toUtf8String(_fragment+1,_end-_fragment-1); - } + public String getFragment() + { + if (_fragment==_end) + return null; + return toUtf8String(_fragment+1,_end-_fragment-1); + } - public void decodeQueryTo(MultiMap parameters) - { - if (_query==_fragment) - return; - _utf8b.reset(); - UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters,_utf8b); - } + public void decodeQueryTo(MultiMap parameters) + { + if (_query==_fragment) + return; + _utf8b.reset(); + UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters,_utf8b); + } - public void decodeQueryTo(MultiMap parameters, String encoding) - throws UnsupportedEncodingException - { - if (_query==_fragment) - return; + public void decodeQueryTo(MultiMap parameters, String encoding) + throws UnsupportedEncodingException + { + if (_query==_fragment) + return; - if (encoding==null || StringUtil.isUTF8(encoding)) - UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters); - else - UrlEncoded.decodeTo(StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding),parameters,encoding); - } + if (encoding==null || StringUtil.isUTF8(encoding)) + UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters); + else + UrlEncoded.decodeTo(StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding),parameters,encoding); + } - public void clear() - { - _scheme=_authority=_host=_port=_path=_param=_query=_fragment=_end=0; - _raw=__empty; - _rawString=""; - _encoded=false; - } + public void clear() + { + _scheme=_authority=_host=_port=_path=_param=_query=_fragment=_end=0; + _raw=__empty; + _rawString=""; + _encoded=false; + } - @Override - public String toString() - { - if (_rawString==null) - _rawString=toUtf8String(_scheme,_end-_scheme); - return _rawString; - } + @Override + public String toString() + { + if (_rawString==null) + _rawString=toUtf8String(_scheme,_end-_scheme); + return _rawString; + } - public void writeTo(Utf8StringBuilder buf) - { - buf.append(_raw,_scheme,_end-_scheme); - } + public void writeTo(Utf8StringBuilder buf) + { + buf.append(_raw,_scheme,_end-_scheme); + } }