📄 httpuri.java
字号:
//========================================================================//Copyright 2006 Mort Bay Consulting Pty. Ltd.//------------------------------------------------------------------------//Licensed under the Apache License, Version 2.0 (the "License");//you may not use this file except in compliance with the License.//You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0//Unless required by applicable law or agreed to in writing, software//distributed under the License is distributed on an "AS IS" BASIS,//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.//See the License for the specific language governing permissions and//limitations under the License.//========================================================================package org.mortbay.jetty;import java.io.UnsupportedEncodingException;import org.mortbay.util.MultiMap;import org.mortbay.util.StringUtil;import org.mortbay.util.TypeUtil;import org.mortbay.util.URIUtil;import org.mortbay.util.UrlEncoded;import org.mortbay.util.Utf8StringBuffer;/* ------------------------------------------------------------ *//** Http URI. * Parse a HTTP URI from a string or byte array. Given a URI * <code>http://user@host:port/path/info;param?query#fragment</code> * this class will split it into the following undecoded optional elements:<ul> * <li>{@link #getScheme()} - http:</li> * <li>{@link #getAuthority()} - //name@host:port</li> * <li>{@link #getHost()} - host</li> * <li>{@link #getPort()} - port</li> * <li>{@link #getPath()} - /path/info</li> * <li>{@link #getParam()} - param</li> * <li>{@link #getQuery()} - query</li> * <li>{@link #getFragment()} - fragment</li> * </ul> * */public class HttpURI{ private static 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 _path; int _param; int _query; int _fragment; int _end; Utf8StringBuffer _utf8b = new Utf8StringBuffer(64); 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; } public HttpURI(String raw) { _rawString=raw; byte[] b = raw.getBytes(); parse(b,0,b.length); } public HttpURI(byte[] raw,int offset, int length) { parse2(raw,offset,length); } 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); } private void parse2(byte[] raw,int offset, int length) { _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; _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; default: if (Character.isLetterOrDigit(c)) state=SCHEME_OR_PATH; else throw new IllegalArgumentException(StringUtil.toString(_raw,offset,length,URIUtil.__CHARSET)); } 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=':'; } } 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 ';': { _param = s; state = PARAM; break; } case '?': { _param = s; _query = s; state = QUERY; break; } case '#': { _param = s; _query = s; _fragment = s; break; } } continue; } case AUTH: { switch (c) { case '/': { m = s; _path = m; _port = _path; state = PATH; break; } case '@': { _host = i; break; } case ':': { _port = s; state = PORT; break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -