<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * software distributed under the License is distributed on an<a name="line.13"></a>
<span class="sourceLineNo">014</span> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<span class="sourceLineNo">015</span> * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<span class="sourceLineNo">016</span> * specific language governing permissions and limitations<a name="line.16"></a>
<span class="sourceLineNo">017</span> * under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> */<a name="line.18"></a>
<span class="sourceLineNo">019</span>package org.apache.shiro.web.servlet;<a name="line.19"></a>
<span class="sourceLineNo">020</span><a name="line.20"></a>
<span class="sourceLineNo">021</span>import javax.servlet.ServletContext;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import javax.servlet.http.HttpServletRequest;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import javax.servlet.http.HttpServletResponse;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import javax.servlet.http.HttpServletResponseWrapper;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import javax.servlet.http.HttpSession;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.net.MalformedURLException;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.net.URL;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.net.URLEncoder;<a name="line.29"></a>
<span class="sourceLineNo">030</span><a name="line.30"></a>
<span class="sourceLineNo">031</span>/**<a name="line.31"></a>
<span class="sourceLineNo">032</span> * HttpServletResponse implementation to support URL Encoding of Shiro Session IDs.<a name="line.32"></a>
<span class="sourceLineNo">033</span> * &lt;p/&gt;<a name="line.33"></a>
<span class="sourceLineNo">034</span> * It is only used when using Shiro's native Session Management configuration (and not when using the Servlet<a name="line.34"></a>
<span class="sourceLineNo">035</span> * Container session configuration, which is Shiro's default in a web environment).  Because the servlet container<a name="line.35"></a>
<span class="sourceLineNo">036</span> * already performs url encoding of its own session ids, instances of this class are only needed when using Shiro<a name="line.36"></a>
<span class="sourceLineNo">037</span> * native sessions.<a name="line.37"></a>
<span class="sourceLineNo">038</span> * &lt;p/&gt;<a name="line.38"></a>
<span class="sourceLineNo">039</span> * Note that this implementation relies in part on source code from the Tomcat 6.x distribution for<a name="line.39"></a>
<span class="sourceLineNo">040</span> * encoding URLs for session ID URL Rewriting (we didn't want to re-invent the wheel).  Since Shiro is also<a name="line.40"></a>
<span class="sourceLineNo">041</span> * Apache 2.0 license, all regular licenses and conditions have remained in tact.<a name="line.41"></a>
<span class="sourceLineNo">042</span> *<a name="line.42"></a>
<span class="sourceLineNo">043</span> * @since 0.2<a name="line.43"></a>
<span class="sourceLineNo">044</span> */<a name="line.44"></a>
<span class="sourceLineNo">045</span>public class ShiroHttpServletResponse extends HttpServletResponseWrapper {<a name="line.45"></a>
<span class="sourceLineNo">046</span><a name="line.46"></a>
<span class="sourceLineNo">047</span>    //TODO - complete JavaDoc<a name="line.47"></a>
<span class="sourceLineNo">048</span><a name="line.48"></a>
<span class="sourceLineNo">049</span>    private static final String DEFAULT_SESSION_ID_PARAMETER_NAME = ShiroHttpSession.DEFAULT_SESSION_ID_NAME;<a name="line.49"></a>
<span class="sourceLineNo">050</span><a name="line.50"></a>
<span class="sourceLineNo">051</span>    private ServletContext context = null;<a name="line.51"></a>
<span class="sourceLineNo">052</span>    //the associated request<a name="line.52"></a>
<span class="sourceLineNo">053</span>    private ShiroHttpServletRequest request = null;<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>    public ShiroHttpServletResponse(HttpServletResponse wrapped, ServletContext context, ShiroHttpServletRequest request) {<a name="line.55"></a>
<span class="sourceLineNo">056</span>        super(wrapped);<a name="line.56"></a>
<span class="sourceLineNo">057</span>        this.context = context;<a name="line.57"></a>
<span class="sourceLineNo">058</span>        this.request = request;<a name="line.58"></a>
<span class="sourceLineNo">059</span>    }<a name="line.59"></a>
<span class="sourceLineNo">060</span><a name="line.60"></a>
<span class="sourceLineNo">061</span>    @SuppressWarnings({"UnusedDeclaration"})<a name="line.61"></a>
<span class="sourceLineNo">062</span>    public ServletContext getContext() {<a name="line.62"></a>
<span class="sourceLineNo">063</span>        return context;<a name="line.63"></a>
<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
<span class="sourceLineNo">065</span><a name="line.65"></a>
<span class="sourceLineNo">066</span>    @SuppressWarnings({"UnusedDeclaration"})<a name="line.66"></a>
<span class="sourceLineNo">067</span>    public void setContext(ServletContext context) {<a name="line.67"></a>
<span class="sourceLineNo">068</span>        this.context = context;<a name="line.68"></a>
<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>    public ShiroHttpServletRequest getRequest() {<a name="line.71"></a>
<span class="sourceLineNo">072</span>        return request;<a name="line.72"></a>
<span class="sourceLineNo">073</span>    }<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>    @SuppressWarnings({"UnusedDeclaration"})<a name="line.75"></a>
<span class="sourceLineNo">076</span>    public void setRequest(ShiroHttpServletRequest request) {<a name="line.76"></a>
<span class="sourceLineNo">077</span>        this.request = request;<a name="line.77"></a>
<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
<span class="sourceLineNo">079</span><a name="line.79"></a>
<span class="sourceLineNo">080</span>    /**<a name="line.80"></a>
<span class="sourceLineNo">081</span>     * Encode the session identifier associated with this response<a name="line.81"></a>
<span class="sourceLineNo">082</span>     * into the specified redirect URL, if necessary.<a name="line.82"></a>
<span class="sourceLineNo">083</span>     *<a name="line.83"></a>
<span class="sourceLineNo">084</span>     * @param url URL to be encoded<a name="line.84"></a>
<span class="sourceLineNo">085</span>     */<a name="line.85"></a>
<span class="sourceLineNo">086</span>    public String encodeRedirectURL(String url) {<a name="line.86"></a>
<span class="sourceLineNo">087</span>        if (isEncodeable(toAbsolute(url))) {<a name="line.87"></a>
<span class="sourceLineNo">088</span>            return toEncoded(url, request.getSession().getId());<a name="line.88"></a>
<span class="sourceLineNo">089</span>        } else {<a name="line.89"></a>
<span class="sourceLineNo">090</span>            return url;<a name="line.90"></a>
<span class="sourceLineNo">091</span>        }<a name="line.91"></a>
<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span><a name="line.94"></a>
<span class="sourceLineNo">095</span>    public String encodeRedirectUrl(String s) {<a name="line.95"></a>
<span class="sourceLineNo">096</span>        return encodeRedirectURL(s);<a name="line.96"></a>
<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
<span class="sourceLineNo">098</span><a name="line.98"></a>
<span class="sourceLineNo">099</span><a name="line.99"></a>
<span class="sourceLineNo">100</span>    /**<a name="line.100"></a>
<span class="sourceLineNo">101</span>     * Encode the session identifier associated with this response<a name="line.101"></a>
<span class="sourceLineNo">102</span>     * into the specified URL, if necessary.<a name="line.102"></a>
<span class="sourceLineNo">103</span>     *<a name="line.103"></a>
<span class="sourceLineNo">104</span>     * @param url URL to be encoded<a name="line.104"></a>
<span class="sourceLineNo">105</span>     */<a name="line.105"></a>
<span class="sourceLineNo">106</span>    public String encodeURL(String url) {<a name="line.106"></a>
<span class="sourceLineNo">107</span>        String absolute = toAbsolute(url);<a name="line.107"></a>
<span class="sourceLineNo">108</span>        if (isEncodeable(absolute)) {<a name="line.108"></a>
<span class="sourceLineNo">109</span>            // W3c spec clearly said<a name="line.109"></a>
<span class="sourceLineNo">110</span>            if (url.equalsIgnoreCase("")) {<a name="line.110"></a>
<span class="sourceLineNo">111</span>                url = absolute;<a name="line.111"></a>
<span class="sourceLineNo">112</span>            }<a name="line.112"></a>
<span class="sourceLineNo">113</span>            return toEncoded(url, request.getSession().getId());<a name="line.113"></a>
<span class="sourceLineNo">114</span>        } else {<a name="line.114"></a>
<span class="sourceLineNo">115</span>            return url;<a name="line.115"></a>
<span class="sourceLineNo">116</span>        }<a name="line.116"></a>
<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
<span class="sourceLineNo">118</span><a name="line.118"></a>
<span class="sourceLineNo">119</span>    public String encodeUrl(String s) {<a name="line.119"></a>
<span class="sourceLineNo">120</span>        return encodeURL(s);<a name="line.120"></a>
<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
<span class="sourceLineNo">122</span><a name="line.122"></a>
<span class="sourceLineNo">123</span>    /**<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * Return &lt;code&gt;true&lt;/code&gt; if the specified URL should be encoded with<a name="line.124"></a>
<span class="sourceLineNo">125</span>     * a session identifier.  This will be true if all of the following<a name="line.125"></a>
<span class="sourceLineNo">126</span>     * conditions are met:<a name="line.126"></a>
<span class="sourceLineNo">127</span>     * &lt;ul&gt;<a name="line.127"></a>
<span class="sourceLineNo">128</span>     * &lt;li&gt;The request we are responding to asked for a valid session<a name="line.128"></a>
<span class="sourceLineNo">129</span>     * &lt;li&gt;The requested session ID was not received via a cookie<a name="line.129"></a>
<span class="sourceLineNo">130</span>     * &lt;li&gt;The specified URL points back to somewhere within the web<a name="line.130"></a>
<span class="sourceLineNo">131</span>     * application that is responding to this request<a name="line.131"></a>
<span class="sourceLineNo">132</span>     * &lt;/ul&gt;<a name="line.132"></a>
<span class="sourceLineNo">133</span>     *<a name="line.133"></a>
<span class="sourceLineNo">134</span>     * @param location Absolute URL to be validated<a name="line.134"></a>
<span class="sourceLineNo">135</span>     * @return {@code true} if the specified URL should be encoded with a session identifier, {@code false} otherwise.<a name="line.135"></a>
<span class="sourceLineNo">136</span>     */<a name="line.136"></a>
<span class="sourceLineNo">137</span>    protected boolean isEncodeable(final String location) {<a name="line.137"></a>
<span class="sourceLineNo">138</span><a name="line.138"></a>
<span class="sourceLineNo">139</span>        if (location == null)<a name="line.139"></a>
<span class="sourceLineNo">140</span>            return (false);<a name="line.140"></a>
<span class="sourceLineNo">141</span><a name="line.141"></a>
<span class="sourceLineNo">142</span>        // Is this an intra-document reference?<a name="line.142"></a>
<span class="sourceLineNo">143</span>        if (location.startsWith("#"))<a name="line.143"></a>
<span class="sourceLineNo">144</span>            return (false);<a name="line.144"></a>
<span class="sourceLineNo">145</span><a name="line.145"></a>
<span class="sourceLineNo">146</span>        // Are we in a valid session that is not using cookies?<a name="line.146"></a>
<span class="sourceLineNo">147</span>        final HttpServletRequest hreq = request;<a name="line.147"></a>
<span class="sourceLineNo">148</span>        final HttpSession session = hreq.getSession(false);<a name="line.148"></a>
<span class="sourceLineNo">149</span>        if (session == null)<a name="line.149"></a>
<span class="sourceLineNo">150</span>            return (false);<a name="line.150"></a>
<span class="sourceLineNo">151</span>        if (hreq.isRequestedSessionIdFromCookie())<a name="line.151"></a>
<span class="sourceLineNo">152</span>            return (false);<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>        return doIsEncodeable(hreq, session, location);<a name="line.154"></a>
<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span>    private boolean doIsEncodeable(HttpServletRequest hreq, HttpSession session, String location) {<a name="line.157"></a>
<span class="sourceLineNo">158</span>        // Is this a valid absolute URL?<a name="line.158"></a>
<span class="sourceLineNo">159</span>        URL url;<a name="line.159"></a>
<span class="sourceLineNo">160</span>        try {<a name="line.160"></a>
<span class="sourceLineNo">161</span>            url = new URL(location);<a name="line.161"></a>
<span class="sourceLineNo">162</span>        } catch (MalformedURLException e) {<a name="line.162"></a>
<span class="sourceLineNo">163</span>            return (false);<a name="line.163"></a>
<span class="sourceLineNo">164</span>        }<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>        // Does this URL match down to (and including) the context path?<a name="line.166"></a>
<span class="sourceLineNo">167</span>        if (!hreq.getScheme().equalsIgnoreCase(url.getProtocol()))<a name="line.167"></a>
<span class="sourceLineNo">168</span>            return (false);<a name="line.168"></a>
<span class="sourceLineNo">169</span>        if (!hreq.getServerName().equalsIgnoreCase(url.getHost()))<a name="line.169"></a>
<span class="sourceLineNo">170</span>            return (false);<a name="line.170"></a>
<span class="sourceLineNo">171</span>        int serverPort = hreq.getServerPort();<a name="line.171"></a>
<span class="sourceLineNo">172</span>        if (serverPort == -1) {<a name="line.172"></a>
<span class="sourceLineNo">173</span>            if ("https".equals(hreq.getScheme()))<a name="line.173"></a>
<span class="sourceLineNo">174</span>                serverPort = 443;<a name="line.174"></a>
<span class="sourceLineNo">175</span>            else<a name="line.175"></a>
<span class="sourceLineNo">176</span>                serverPort = 80;<a name="line.176"></a>
<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
<span class="sourceLineNo">178</span>        int urlPort = url.getPort();<a name="line.178"></a>
<span class="sourceLineNo">179</span>        if (urlPort == -1) {<a name="line.179"></a>
<span class="sourceLineNo">180</span>            if ("https".equals(url.getProtocol()))<a name="line.180"></a>
<span class="sourceLineNo">181</span>                urlPort = 443;<a name="line.181"></a>
<span class="sourceLineNo">182</span>            else<a name="line.182"></a>
<span class="sourceLineNo">183</span>                urlPort = 80;<a name="line.183"></a>
<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
<span class="sourceLineNo">185</span>        if (serverPort != urlPort)<a name="line.185"></a>
<span class="sourceLineNo">186</span>            return (false);<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>        String contextPath = getRequest().getContextPath();<a name="line.188"></a>
<span class="sourceLineNo">189</span>        if (contextPath != null) {<a name="line.189"></a>
<span class="sourceLineNo">190</span>            String file = url.getFile();<a name="line.190"></a>
<span class="sourceLineNo">191</span>            if ((file == null) || !file.startsWith(contextPath))<a name="line.191"></a>
<span class="sourceLineNo">192</span>                return (false);<a name="line.192"></a>
<span class="sourceLineNo">193</span>            String tok = ";" + DEFAULT_SESSION_ID_PARAMETER_NAME + "=" + session.getId();<a name="line.193"></a>
<span class="sourceLineNo">194</span>            if (file.indexOf(tok, contextPath.length()) &gt;= 0)<a name="line.194"></a>
<span class="sourceLineNo">195</span>                return (false);<a name="line.195"></a>
<span class="sourceLineNo">196</span>        }<a name="line.196"></a>
<span class="sourceLineNo">197</span><a name="line.197"></a>
<span class="sourceLineNo">198</span>        // This URL belongs to our web application, so it is encodeable<a name="line.198"></a>
<span class="sourceLineNo">199</span>        return (true);<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
<span class="sourceLineNo">202</span><a name="line.202"></a>
<span class="sourceLineNo">203</span><a name="line.203"></a>
<span class="sourceLineNo">204</span>    /**<a name="line.204"></a>
<span class="sourceLineNo">205</span>     * Convert (if necessary) and return the absolute URL that represents the<a name="line.205"></a>
<span class="sourceLineNo">206</span>     * resource referenced by this possibly relative URL.  If this URL is<a name="line.206"></a>
<span class="sourceLineNo">207</span>     * already absolute, return it unchanged.<a name="line.207"></a>
<span class="sourceLineNo">208</span>     *<a name="line.208"></a>
<span class="sourceLineNo">209</span>     * @param location URL to be (possibly) converted and then returned<a name="line.209"></a>
<span class="sourceLineNo">210</span>     * @return resource location as an absolute url<a name="line.210"></a>
<span class="sourceLineNo">211</span>     * @throws IllegalArgumentException if a MalformedURLException is<a name="line.211"></a>
<span class="sourceLineNo">212</span>     *                                  thrown when converting the relative URL to an absolute one<a name="line.212"></a>
<span class="sourceLineNo">213</span>     */<a name="line.213"></a>
<span class="sourceLineNo">214</span>    private String toAbsolute(String location) {<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span>        if (location == null)<a name="line.216"></a>
<span class="sourceLineNo">217</span>            return (location);<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>        boolean leadingSlash = location.startsWith("/");<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>        if (leadingSlash || !hasScheme(location)) {<a name="line.221"></a>
<span class="sourceLineNo">222</span><a name="line.222"></a>
<span class="sourceLineNo">223</span>            StringBuilder buf = new StringBuilder();<a name="line.223"></a>
<span class="sourceLineNo">224</span><a name="line.224"></a>
<span class="sourceLineNo">225</span>            String scheme = request.getScheme();<a name="line.225"></a>
<span class="sourceLineNo">226</span>            String name = request.getServerName();<a name="line.226"></a>
<span class="sourceLineNo">227</span>            int port = request.getServerPort();<a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
<span class="sourceLineNo">229</span>            try {<a name="line.229"></a>
<span class="sourceLineNo">230</span>                buf.append(scheme).append("://").append(name);<a name="line.230"></a>
<span class="sourceLineNo">231</span>                if ((scheme.equals("http") &amp;&amp; port != 80)<a name="line.231"></a>
<span class="sourceLineNo">232</span>                        || (scheme.equals("https") &amp;&amp; port != 443)) {<a name="line.232"></a>
<span class="sourceLineNo">233</span>                    buf.append(':').append(port);<a name="line.233"></a>
<span class="sourceLineNo">234</span>                }<a name="line.234"></a>
<span class="sourceLineNo">235</span>                if (!leadingSlash) {<a name="line.235"></a>
<span class="sourceLineNo">236</span>                    String relativePath = request.getRequestURI();<a name="line.236"></a>
<span class="sourceLineNo">237</span>                    int pos = relativePath.lastIndexOf('/');<a name="line.237"></a>
<span class="sourceLineNo">238</span>                    relativePath = relativePath.substring(0, pos);<a name="line.238"></a>
<span class="sourceLineNo">239</span><a name="line.239"></a>
<span class="sourceLineNo">240</span>                    String encodedURI = URLEncoder.encode(relativePath, getCharacterEncoding());<a name="line.240"></a>
<span class="sourceLineNo">241</span>                    buf.append(encodedURI).append('/');<a name="line.241"></a>
<span class="sourceLineNo">242</span>                }<a name="line.242"></a>
<span class="sourceLineNo">243</span>                buf.append(location);<a name="line.243"></a>
<span class="sourceLineNo">244</span>            } catch (IOException e) {<a name="line.244"></a>
<span class="sourceLineNo">245</span>                IllegalArgumentException iae = new IllegalArgumentException(location);<a name="line.245"></a>
<span class="sourceLineNo">246</span>                iae.initCause(e);<a name="line.246"></a>
<span class="sourceLineNo">247</span>                throw iae;<a name="line.247"></a>
<span class="sourceLineNo">248</span>            }<a name="line.248"></a>
<span class="sourceLineNo">249</span><a name="line.249"></a>
<span class="sourceLineNo">250</span>            return buf.toString();<a name="line.250"></a>
<span class="sourceLineNo">251</span><a name="line.251"></a>
<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
<span class="sourceLineNo">253</span>            return location;<a name="line.253"></a>
<span class="sourceLineNo">254</span>        }<a name="line.254"></a>
<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
<span class="sourceLineNo">256</span><a name="line.256"></a>
<span class="sourceLineNo">257</span>    /**<a name="line.257"></a>
<span class="sourceLineNo">258</span>     * Determine if the character is allowed in the scheme of a URI.<a name="line.258"></a>
<span class="sourceLineNo">259</span>     * See RFC 2396, Section 3.1<a name="line.259"></a>
<span class="sourceLineNo">260</span>     *<a name="line.260"></a>
<span class="sourceLineNo">261</span>     * @param c the character to check<a name="line.261"></a>
<span class="sourceLineNo">262</span>     * @return {@code true} if the character is allowed in a URI scheme, {@code false} otherwise.<a name="line.262"></a>
<span class="sourceLineNo">263</span>     */<a name="line.263"></a>
<span class="sourceLineNo">264</span>    public static boolean isSchemeChar(char c) {<a name="line.264"></a>
<span class="sourceLineNo">265</span>        return Character.isLetterOrDigit(c) ||<a name="line.265"></a>
<span class="sourceLineNo">266</span>                c == '+' || c == '-' || c == '.';<a name="line.266"></a>
<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
<span class="sourceLineNo">268</span><a name="line.268"></a>
<span class="sourceLineNo">269</span><a name="line.269"></a>
<span class="sourceLineNo">270</span>    /**<a name="line.270"></a>
<span class="sourceLineNo">271</span>     * Returns {@code true} if the URI string has a {@code scheme} component, {@code false} otherwise.<a name="line.271"></a>
<span class="sourceLineNo">272</span>     *<a name="line.272"></a>
<span class="sourceLineNo">273</span>     * @param uri the URI string to check for a scheme component<a name="line.273"></a>
<span class="sourceLineNo">274</span>     * @return {@code true} if the URI string has a {@code scheme} component, {@code false} otherwise.<a name="line.274"></a>
<span class="sourceLineNo">275</span>     */<a name="line.275"></a>
<span class="sourceLineNo">276</span>    private boolean hasScheme(String uri) {<a name="line.276"></a>
<span class="sourceLineNo">277</span>        int len = uri.length();<a name="line.277"></a>
<span class="sourceLineNo">278</span>        for (int i = 0; i &lt; len; i++) {<a name="line.278"></a>
<span class="sourceLineNo">279</span>            char c = uri.charAt(i);<a name="line.279"></a>
<span class="sourceLineNo">280</span>            if (c == ':') {<a name="line.280"></a>
<span class="sourceLineNo">281</span>                return i &gt; 0;<a name="line.281"></a>
<span class="sourceLineNo">282</span>            } else if (!isSchemeChar(c)) {<a name="line.282"></a>
<span class="sourceLineNo">283</span>                return false;<a name="line.283"></a>
<span class="sourceLineNo">284</span>            }<a name="line.284"></a>
<span class="sourceLineNo">285</span>        }<a name="line.285"></a>
<span class="sourceLineNo">286</span>        return false;<a name="line.286"></a>
<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
<span class="sourceLineNo">288</span><a name="line.288"></a>
<span class="sourceLineNo">289</span>    /**<a name="line.289"></a>
<span class="sourceLineNo">290</span>     * Return the specified URL with the specified session identifier suitably encoded.<a name="line.290"></a>
<span class="sourceLineNo">291</span>     *<a name="line.291"></a>
<span class="sourceLineNo">292</span>     * @param url       URL to be encoded with the session id<a name="line.292"></a>
<span class="sourceLineNo">293</span>     * @param sessionId Session id to be included in the encoded URL<a name="line.293"></a>
<span class="sourceLineNo">294</span>     * @return the url with the session identifer properly encoded.<a name="line.294"></a>
<span class="sourceLineNo">295</span>     */<a name="line.295"></a>
<span class="sourceLineNo">296</span>    protected String toEncoded(String url, String sessionId) {<a name="line.296"></a>
<span class="sourceLineNo">297</span><a name="line.297"></a>
<span class="sourceLineNo">298</span>        if ((url == null) || (sessionId == null))<a name="line.298"></a>
<span class="sourceLineNo">299</span>            return (url);<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>        String path = url;<a name="line.301"></a>
<span class="sourceLineNo">302</span>        String query = "";<a name="line.302"></a>
<span class="sourceLineNo">303</span>        String anchor = "";<a name="line.303"></a>
<span class="sourceLineNo">304</span>        int question = url.indexOf('?');<a name="line.304"></a>
<span class="sourceLineNo">305</span>        if (question &gt;= 0) {<a name="line.305"></a>
<span class="sourceLineNo">306</span>            path = url.substring(0, question);<a name="line.306"></a>
<span class="sourceLineNo">307</span>            query = url.substring(question);<a name="line.307"></a>
<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
<span class="sourceLineNo">309</span>        int pound = path.indexOf('#');<a name="line.309"></a>
<span class="sourceLineNo">310</span>        if (pound &gt;= 0) {<a name="line.310"></a>
<span class="sourceLineNo">311</span>            anchor = path.substring(pound);<a name="line.311"></a>
<span class="sourceLineNo">312</span>            path = path.substring(0, pound);<a name="line.312"></a>
<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
<span class="sourceLineNo">314</span>        StringBuilder sb = new StringBuilder(path);<a name="line.314"></a>
<span class="sourceLineNo">315</span>        if (sb.length() &gt; 0) { // session id param can't be first.<a name="line.315"></a>
<span class="sourceLineNo">316</span>            sb.append(";");<a name="line.316"></a>
<span class="sourceLineNo">317</span>            sb.append(DEFAULT_SESSION_ID_PARAMETER_NAME);<a name="line.317"></a>
<span class="sourceLineNo">318</span>            sb.append("=");<a name="line.318"></a>
<span class="sourceLineNo">319</span>            sb.append(sessionId);<a name="line.319"></a>
<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
<span class="sourceLineNo">321</span>        sb.append(anchor);<a name="line.321"></a>
<span class="sourceLineNo">322</span>        sb.append(query);<a name="line.322"></a>
<span class="sourceLineNo">323</span>        return (sb.toString());<a name="line.323"></a>
<span class="sourceLineNo">324</span><a name="line.324"></a>
<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
<span class="sourceLineNo">326</span>}<a name="line.326"></a>




























































</pre>
</div>
</body>
</html>