📄 uriutil.java
字号:
// ========================================================================// Copyright 2004-2005 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.util;import java.io.UnsupportedEncodingException;/* ------------------------------------------------------------ *//** URI Holder. * This class assists with the decoding and encoding or HTTP URI's. * It differs from the java.net.URL class as it does not provide * communications ability, but it does assist with query string * formatting. * <P>UTF-8 encoding is used by default for % encoded characters. This * may be overridden with the org.mortbay.util.URI.charset system property. * @see UrlEncoded * @author Greg Wilkins (gregw) */public class URIUtil implements Cloneable{ public static final String SLASH="/"; public static final String HTTP="http"; public static final String HTTP_COLON="http:"; public static final String HTTPS="https"; public static final String HTTPS_COLON="https:"; // Use UTF-8 as per http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars public static final String __CHARSET=System.getProperty("org.mortbay.util.URI.charset",StringUtil.__UTF8); private URIUtil() {} /* ------------------------------------------------------------ */ /** Encode a URI path. * This is the same encoding offered by URLEncoder, except that * the '/' character is not encoded. * @param path The path the encode * @return The encoded path */ public static String encodePath(String path) { if (path==null || path.length()==0) return path; StringBuffer buf = encodePath(null,path); return buf==null?path:buf.toString(); } /* ------------------------------------------------------------ */ /** Encode a URI path. * @param path The path the encode * @param buf StringBuffer to encode path into (or null) * @return The StringBuffer or null if no substitutions required. */ public static StringBuffer encodePath(StringBuffer buf, String path) { if (buf==null) { loop: for (int i=0;i<path.length();i++) { char c=path.charAt(i); switch(c) { case '%': case '?': case ';': case '#': case '\'': case '"': case '<': case '>': case ' ': buf=new StringBuffer(path.length()<<1); break loop; } } if (buf==null) return null; } synchronized(buf) { for (int i=0;i<path.length();i++) { char c=path.charAt(i); switch(c) { case '%': buf.append("%25"); continue; case '?': buf.append("%3F"); continue; case ';': buf.append("%3B"); continue; case '#': buf.append("%23"); continue; case '"': buf.append("%22"); continue; case '\'': buf.append("%27"); continue; case '<': buf.append("%3C"); continue; case '>': buf.append("%3E"); continue; case ' ': buf.append("%20"); continue; default: buf.append(c); continue; } } } return buf; } /* ------------------------------------------------------------ */ /** Encode a URI path. * @param path The path the encode * @param buf StringBuffer to encode path into (or null) * @param encode String of characters to encode. % is always encoded. * @return The StringBuffer or null if no substitutions required. */ public static StringBuffer encodeString(StringBuffer buf, String path, String encode) { if (buf==null) { loop: for (int i=0;i<path.length();i++) { char c=path.charAt(i); if (c=='%' || encode.indexOf(c)>=0) { buf=new StringBuffer(path.length()<<1); break loop; } } if (buf==null) return null; } synchronized(buf) { for (int i=0;i<path.length();i++) { char c=path.charAt(i); if (c=='%' || encode.indexOf(c)>=0) { buf.append('%'); StringUtil.append(buf,(byte)(0xff&c),16); } else buf.append(c); } } return buf; } /* ------------------------------------------------------------ */ /* Decode a URI path. * @param path The path the encode * @param buf StringBuffer to encode path into */ public static String decodePath(String path) { if (path==null) return null; char[] chars=null; int n=0; byte[] bytes=null; int b=0; int len=path.length(); for (int i=0;i<len;i++) { char c = path.charAt(i); if (c=='%' && (i+2)<len) { if (chars==null) { chars=new char[len]; bytes=new byte[len]; path.getChars(0,i,chars,0); } bytes[b++]=(byte)(0xff&TypeUtil.parseInt(path,i+1,2,16)); i+=2; continue; } else if (bytes==null) { n++; continue; } if (b>0) { String s; try { s=new String(bytes,0,b,__CHARSET); } catch (UnsupportedEncodingException e) { s=new String(bytes,0,b); } s.getChars(0,s.length(),chars,n); n+=s.length(); b=0; } chars[n++]=c; } if (chars==null) return path; if (b>0) { String s; try { s=new String(bytes,0,b,__CHARSET); } catch (UnsupportedEncodingException e) { s=new String(bytes,0,b); } s.getChars(0,s.length(),chars,n); n+=s.length(); } return new String(chars,0,n); } /* ------------------------------------------------------------ */ /* Decode a URI path. * @param path The path the encode * @param buf StringBuffer to encode path into */ public static String decodePath(byte[] buf, int offset, int length) { byte[] bytes=null; int n=0; for (int i=0;i<length;i++) { byte b = buf[i + offset]; if (b=='%' && (i+2)<length) { b=(byte)(0xff&TypeUtil.parseInt(buf,i+offset+1,2,16)); i+=2; } else if (bytes==null) { n++; continue; } if (bytes==null) { bytes=new byte[length]; for (int j=0;j<n;j++) bytes[j]=buf[j + offset]; } bytes[n++]=b; } if (bytes==null) return StringUtil.toString(buf,offset,length,__CHARSET); return StringUtil.toString(bytes,0,n,__CHARSET); } /* ------------------------------------------------------------ */ /** Add two URI path segments. * Handles null and empty paths, path and query params (eg ?a=b or * ;JSESSIONID=xxx) and avoids duplicate '/' * @param p1 URI path segment (should be encoded)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -