1 package org.mortbay.jetty;
2
3 import java.io.UnsupportedEncodingException;
4
5 import org.mortbay.util.MultiMap;
6 import org.mortbay.util.StringUtil;
7 import org.mortbay.util.TypeUtil;
8 import org.mortbay.util.URIUtil;
9 import org.mortbay.util.UrlEncoded;
10 import org.mortbay.util.Utf8StringBuffer;
11
12 public class EncodedHttpURI extends HttpURI
13 {
14 private String _encoding;
15
16 public EncodedHttpURI(String encoding)
17 {
18 super();
19 _encoding = encoding;
20 }
21
22
23 public String getScheme()
24 {
25 if (_scheme==_authority)
26 return null;
27 int l=_authority-_scheme;
28 if (l==5 &&
29 _raw[_scheme]=='h' &&
30 _raw[_scheme+1]=='t' &&
31 _raw[_scheme+2]=='t' &&
32 _raw[_scheme+3]=='p' )
33 return HttpSchemes.HTTP;
34 if (l==6 &&
35 _raw[_scheme]=='h' &&
36 _raw[_scheme+1]=='t' &&
37 _raw[_scheme+2]=='t' &&
38 _raw[_scheme+3]=='p' &&
39 _raw[_scheme+4]=='s' )
40 return HttpSchemes.HTTPS;
41
42 return StringUtil.toString(_raw,_scheme,_authority-_scheme-1,_encoding);
43 }
44
45 public String getAuthority()
46 {
47 if (_authority==_path)
48 return null;
49 return StringUtil.toString(_raw,_authority,_path-_authority,_encoding);
50 }
51
52 public String getHost()
53 {
54 if (_host==_port)
55 return null;
56 return StringUtil.toString(_raw,_host,_port-_host,_encoding);
57 }
58
59 public int getPort()
60 {
61 if (_port==_path)
62 return -1;
63 return TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10);
64 }
65
66 public String getPath()
67 {
68 if (_path==_param)
69 return null;
70 return StringUtil.toString(_raw,_path,_param-_path,_encoding);
71 }
72
73 public String getDecodedPath()
74 {
75 if (_path==_param)
76 return null;
77 return URIUtil.decodePath(_raw,_path,_param-_path);
78 }
79
80 public String getPathAndParam()
81 {
82 if (_path==_query)
83 return null;
84 return StringUtil.toString(_raw,_path,_query-_path,_encoding);
85 }
86
87 public String getCompletePath()
88 {
89 if (_path==_end)
90 return null;
91 return StringUtil.toString(_raw,_path,_end-_path,_encoding);
92 }
93
94 public String getParam()
95 {
96 if (_param==_query)
97 return null;
98 return StringUtil.toString(_raw,_param+1,_query-_param-1,_encoding);
99 }
100
101 public String getQuery()
102 {
103 if (_query==_fragment)
104 return null;
105 return StringUtil.toString(_raw,_query+1,_fragment-_query-1,_encoding);
106 }
107
108 public boolean hasQuery()
109 {
110 return (_fragment>_query);
111 }
112
113 public String getFragment()
114 {
115 if (_fragment==_end)
116 return null;
117 return StringUtil.toString(_raw,_fragment+1,_end-_fragment-1,_encoding);
118 }
119
120 public void decodeQueryTo(MultiMap parameters)
121 {
122 if (_query==_fragment)
123 return;
124 UrlEncoded.decodeTo(StringUtil.toString(_raw,_query+1,_fragment-_query-1,_encoding),parameters,_encoding);
125 }
126
127 public void decodeQueryTo(MultiMap parameters, String encoding)
128 throws UnsupportedEncodingException
129 {
130 if (_query==_fragment)
131 return;
132
133 if (encoding==null)
134 encoding=_encoding;
135 UrlEncoded.decodeTo(StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding),parameters,encoding);
136 }
137
138 public String toString()
139 {
140 if (_rawString==null)
141 _rawString= StringUtil.toString(_raw,_scheme,_end-_scheme,_encoding);
142 return _rawString;
143 }
144
145 public void writeTo(Utf8StringBuffer buf)
146 {
147 buf.getStringBuffer().append(toString());
148 }
149
150 }