<!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> */<a name="line.19"></a>
<span class="sourceLineNo">020</span>package org.apache.mina.proxy.filter;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.mina.core.buffer.IoBuffer;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.mina.core.filterchain.IoFilter;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.mina.core.filterchain.IoFilterAdapter;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.mina.core.filterchain.IoFilterChain;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.mina.core.session.IdleStatus;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.mina.core.session.IoSession;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.mina.core.write.WriteRequest;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.mina.proxy.ProxyAuthException;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.mina.proxy.ProxyConnector;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.mina.proxy.ProxyLogicHandler;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.mina.proxy.event.IoSessionEvent;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.mina.proxy.event.IoSessionEventQueue;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.mina.proxy.event.IoSessionEventType;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.mina.proxy.handlers.ProxyRequest;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.mina.proxy.handlers.http.HttpSmartProxyHandler;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.mina.proxy.handlers.socks.Socks4LogicHandler;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.mina.proxy.handlers.socks.Socks5LogicHandler;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.mina.proxy.handlers.socks.SocksProxyConstants;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.mina.proxy.handlers.socks.SocksProxyRequest;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.mina.proxy.session.ProxyIoSession;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
<span class="sourceLineNo">046</span> * ProxyFilter.java - Proxy {@link IoFilter}. <a name="line.46"></a>
<span class="sourceLineNo">047</span> * Automatically inserted into the {@link IoFilter} chain by {@link ProxyConnector}.<a name="line.47"></a>
<span class="sourceLineNo">048</span> * Sends the initial handshake message to the proxy and handles any response<a name="line.48"></a>
<span class="sourceLineNo">049</span> * to the handshake. Once the handshake has completed and the proxied connection has been<a name="line.49"></a>
<span class="sourceLineNo">050</span> * established this filter becomes transparent to data flowing through the connection.<a name="line.50"></a>
<span class="sourceLineNo">051</span> * &lt;p&gt;<a name="line.51"></a>
<span class="sourceLineNo">052</span> * Based upon SSLFilter from mina-filter-ssl.<a name="line.52"></a>
<span class="sourceLineNo">053</span> * <a name="line.53"></a>
<span class="sourceLineNo">054</span> * @author &lt;a href="http://mina.apache.org"&gt;Apache MINA Project&lt;/a&gt;<a name="line.54"></a>
<span class="sourceLineNo">055</span> * @since MINA 2.0.0-M3<a name="line.55"></a>
<span class="sourceLineNo">056</span> */<a name="line.56"></a>
<span class="sourceLineNo">057</span>public class ProxyFilter extends IoFilterAdapter {<a name="line.57"></a>
<span class="sourceLineNo">058</span>    private final static Logger LOGGER = LoggerFactory.getLogger(ProxyFilter.class);<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>     * Create a new {@link ProxyFilter}.<a name="line.61"></a>
<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
<span class="sourceLineNo">063</span>    public ProxyFilter() {<a name="line.63"></a>
<span class="sourceLineNo">064</span>        // Do nothing<a name="line.64"></a>
<span class="sourceLineNo">065</span>    }<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>    /**<a name="line.67"></a>
<span class="sourceLineNo">068</span>     * Called before the filter is added into the filter chain.<a name="line.68"></a>
<span class="sourceLineNo">069</span>     * Checks if chain already holds an {@link ProxyFilter} instance. <a name="line.69"></a>
<span class="sourceLineNo">070</span>     * <a name="line.70"></a>
<span class="sourceLineNo">071</span>     * @param chain the filter chain<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * @param name the name assigned to this filter<a name="line.72"></a>
<span class="sourceLineNo">073</span>     * @param nextFilter the next filter<a name="line.73"></a>
<span class="sourceLineNo">074</span>     * @throws IllegalStateException if chain already contains an instance of <a name="line.74"></a>
<span class="sourceLineNo">075</span>     * {@link ProxyFilter}<a name="line.75"></a>
<span class="sourceLineNo">076</span>     */<a name="line.76"></a>
<span class="sourceLineNo">077</span>    @Override<a name="line.77"></a>
<span class="sourceLineNo">078</span>    public void onPreAdd(final IoFilterChain chain, final String name, final NextFilter nextFilter) {<a name="line.78"></a>
<span class="sourceLineNo">079</span>        if (chain.contains(ProxyFilter.class)) {<a name="line.79"></a>
<span class="sourceLineNo">080</span>            throw new IllegalStateException("A filter chain cannot contain more than one ProxyFilter.");<a name="line.80"></a>
<span class="sourceLineNo">081</span>        }<a name="line.81"></a>
<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
<span class="sourceLineNo">083</span><a name="line.83"></a>
<span class="sourceLineNo">084</span>    /**<a name="line.84"></a>
<span class="sourceLineNo">085</span>     * Called when the filter is removed from the filter chain.<a name="line.85"></a>
<span class="sourceLineNo">086</span>     * Cleans the {@link ProxyIoSession} instance from the session.<a name="line.86"></a>
<span class="sourceLineNo">087</span>     * <a name="line.87"></a>
<span class="sourceLineNo">088</span>     * @param chain the filter chain<a name="line.88"></a>
<span class="sourceLineNo">089</span>     * @param name the name assigned to this filter<a name="line.89"></a>
<span class="sourceLineNo">090</span>     * @param nextFilter the next filter<a name="line.90"></a>
<span class="sourceLineNo">091</span>     */<a name="line.91"></a>
<span class="sourceLineNo">092</span>    @Override<a name="line.92"></a>
<span class="sourceLineNo">093</span>    public void onPreRemove(final IoFilterChain chain, final String name, final NextFilter nextFilter) {<a name="line.93"></a>
<span class="sourceLineNo">094</span>        IoSession session = chain.getSession();<a name="line.94"></a>
<span class="sourceLineNo">095</span>        session.removeAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.95"></a>
<span class="sourceLineNo">096</span>    }<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>     * Called when an exception occurs in the chain. A flag is set in the<a name="line.99"></a>
<span class="sourceLineNo">100</span>     * {@link ProxyIoSession} session's instance to signal that handshake<a name="line.100"></a>
<span class="sourceLineNo">101</span>     * failed.  <a name="line.101"></a>
<span class="sourceLineNo">102</span>     * <a name="line.102"></a>
<span class="sourceLineNo">103</span>     * @param nextFilter next filter in the filter chain<a name="line.103"></a>
<span class="sourceLineNo">104</span>     * @param session the MINA session<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * @param cause the original exception<a name="line.105"></a>
<span class="sourceLineNo">106</span>     */<a name="line.106"></a>
<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
<span class="sourceLineNo">108</span>    public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception {<a name="line.108"></a>
<span class="sourceLineNo">109</span>        ProxyIoSession proxyIoSession = (ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.109"></a>
<span class="sourceLineNo">110</span>        proxyIoSession.setAuthenticationFailed(true);<a name="line.110"></a>
<span class="sourceLineNo">111</span>        super.exceptionCaught(nextFilter, session, cause);<a name="line.111"></a>
<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
<span class="sourceLineNo">113</span><a name="line.113"></a>
<span class="sourceLineNo">114</span>    /**<a name="line.114"></a>
<span class="sourceLineNo">115</span>     * Get the {@link ProxyLogicHandler} for a given session.<a name="line.115"></a>
<span class="sourceLineNo">116</span>     * <a name="line.116"></a>
<span class="sourceLineNo">117</span>     * @param session the session object<a name="line.117"></a>
<span class="sourceLineNo">118</span>     * @return the handler which will handle handshaking with the proxy<a name="line.118"></a>
<span class="sourceLineNo">119</span>     */<a name="line.119"></a>
<span class="sourceLineNo">120</span>    private ProxyLogicHandler getProxyHandler(final IoSession session) {<a name="line.120"></a>
<span class="sourceLineNo">121</span>        ProxyLogicHandler handler = ((ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION)).getHandler();<a name="line.121"></a>
<span class="sourceLineNo">122</span><a name="line.122"></a>
<span class="sourceLineNo">123</span>        if (handler == null) {<a name="line.123"></a>
<span class="sourceLineNo">124</span>            throw new IllegalStateException();<a name="line.124"></a>
<span class="sourceLineNo">125</span>        }<a name="line.125"></a>
<span class="sourceLineNo">126</span><a name="line.126"></a>
<span class="sourceLineNo">127</span>        // Sanity check<a name="line.127"></a>
<span class="sourceLineNo">128</span>        if (handler.getProxyIoSession().getProxyFilter() != this) {<a name="line.128"></a>
<span class="sourceLineNo">129</span>            throw new IllegalArgumentException("Not managed by this filter.");<a name="line.129"></a>
<span class="sourceLineNo">130</span>        }<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
<span class="sourceLineNo">132</span>        return handler;<a name="line.132"></a>
<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
<span class="sourceLineNo">134</span><a name="line.134"></a>
<span class="sourceLineNo">135</span>    /**<a name="line.135"></a>
<span class="sourceLineNo">136</span>     * Receives data from the remote host, passes to the handler if a handshake is in progress, <a name="line.136"></a>
<span class="sourceLineNo">137</span>     * otherwise passes on transparently.<a name="line.137"></a>
<span class="sourceLineNo">138</span>     * <a name="line.138"></a>
<span class="sourceLineNo">139</span>     * @param nextFilter the next filter in filter chain<a name="line.139"></a>
<span class="sourceLineNo">140</span>     * @param session the session object<a name="line.140"></a>
<span class="sourceLineNo">141</span>     * @param message the object holding the received data<a name="line.141"></a>
<span class="sourceLineNo">142</span>     */<a name="line.142"></a>
<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
<span class="sourceLineNo">144</span>    public void messageReceived(final NextFilter nextFilter, final IoSession session, final Object message)<a name="line.144"></a>
<span class="sourceLineNo">145</span>            throws ProxyAuthException {<a name="line.145"></a>
<span class="sourceLineNo">146</span>        ProxyLogicHandler handler = getProxyHandler(session);<a name="line.146"></a>
<span class="sourceLineNo">147</span><a name="line.147"></a>
<span class="sourceLineNo">148</span>        synchronized (handler) {<a name="line.148"></a>
<span class="sourceLineNo">149</span>            IoBuffer buf = (IoBuffer) message;<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>            if (handler.isHandshakeComplete()) {<a name="line.151"></a>
<span class="sourceLineNo">152</span>                // Handshake done - pass data on as-is<a name="line.152"></a>
<span class="sourceLineNo">153</span>                nextFilter.messageReceived(session, buf);<a name="line.153"></a>
<span class="sourceLineNo">154</span><a name="line.154"></a>
<span class="sourceLineNo">155</span>            } else {<a name="line.155"></a>
<span class="sourceLineNo">156</span>                LOGGER.debug(" Data Read: {} ({})", handler, buf);<a name="line.156"></a>
<span class="sourceLineNo">157</span><a name="line.157"></a>
<span class="sourceLineNo">158</span>                // Keep sending handshake data to the handler until we run out<a name="line.158"></a>
<span class="sourceLineNo">159</span>                // of data or the handshake is finished<a name="line.159"></a>
<span class="sourceLineNo">160</span>                while (buf.hasRemaining() &amp;&amp; !handler.isHandshakeComplete()) {<a name="line.160"></a>
<span class="sourceLineNo">161</span>                    LOGGER.debug(" Pre-handshake - passing to handler");<a name="line.161"></a>
<span class="sourceLineNo">162</span><a name="line.162"></a>
<span class="sourceLineNo">163</span>                    int pos = buf.position();<a name="line.163"></a>
<span class="sourceLineNo">164</span>                    handler.messageReceived(nextFilter, buf);<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>                    // Data not consumed or session closing<a name="line.166"></a>
<span class="sourceLineNo">167</span>                    if (buf.position() == pos || session.isClosing()) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>                        return;<a name="line.168"></a>
<span class="sourceLineNo">169</span>                    }<a name="line.169"></a>
<span class="sourceLineNo">170</span>                }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>                // Pass on any remaining data to the next filter<a name="line.172"></a>
<span class="sourceLineNo">173</span>                if (buf.hasRemaining()) {<a name="line.173"></a>
<span class="sourceLineNo">174</span>                    LOGGER.debug(" Passing remaining data to next filter");<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span>                    nextFilter.messageReceived(session, buf);<a name="line.176"></a>
<span class="sourceLineNo">177</span>                }<a name="line.177"></a>
<span class="sourceLineNo">178</span>            }<a name="line.178"></a>
<span class="sourceLineNo">179</span>        }<a name="line.179"></a>
<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
<span class="sourceLineNo">181</span><a name="line.181"></a>
<span class="sourceLineNo">182</span>    /**<a name="line.182"></a>
<span class="sourceLineNo">183</span>     * Filters outgoing writes, queueing them up if necessary while a handshake <a name="line.183"></a>
<span class="sourceLineNo">184</span>     * is ongoing.<a name="line.184"></a>
<span class="sourceLineNo">185</span>     * <a name="line.185"></a>
<span class="sourceLineNo">186</span>     * @param nextFilter the next filter in filter chain<a name="line.186"></a>
<span class="sourceLineNo">187</span>     * @param session the session object<a name="line.187"></a>
<span class="sourceLineNo">188</span>     * @param writeRequest the data to write<a name="line.188"></a>
<span class="sourceLineNo">189</span>     */<a name="line.189"></a>
<span class="sourceLineNo">190</span>    @Override<a name="line.190"></a>
<span class="sourceLineNo">191</span>    public void filterWrite(final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest) {<a name="line.191"></a>
<span class="sourceLineNo">192</span>        writeData(nextFilter, session, writeRequest, false);<a name="line.192"></a>
<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
<span class="sourceLineNo">194</span><a name="line.194"></a>
<span class="sourceLineNo">195</span>    /**<a name="line.195"></a>
<span class="sourceLineNo">196</span>     * Actually write data. Queues the data up unless it relates to the handshake or the <a name="line.196"></a>
<span class="sourceLineNo">197</span>     * handshake is done.<a name="line.197"></a>
<span class="sourceLineNo">198</span>     * <a name="line.198"></a>
<span class="sourceLineNo">199</span>     * @param nextFilter the next filter in filter chain<a name="line.199"></a>
<span class="sourceLineNo">200</span>     * @param session the session object<a name="line.200"></a>
<span class="sourceLineNo">201</span>     * @param writeRequest the data to write<a name="line.201"></a>
<span class="sourceLineNo">202</span>     * @param isHandshakeData true if writeRequest is written by the proxy classes.<a name="line.202"></a>
<span class="sourceLineNo">203</span>     */<a name="line.203"></a>
<span class="sourceLineNo">204</span>    public void writeData(final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest,<a name="line.204"></a>
<span class="sourceLineNo">205</span>            final boolean isHandshakeData) {<a name="line.205"></a>
<span class="sourceLineNo">206</span>        ProxyLogicHandler handler = getProxyHandler(session);<a name="line.206"></a>
<span class="sourceLineNo">207</span><a name="line.207"></a>
<span class="sourceLineNo">208</span>        synchronized (handler) {<a name="line.208"></a>
<span class="sourceLineNo">209</span>            if (handler.isHandshakeComplete()) {<a name="line.209"></a>
<span class="sourceLineNo">210</span>                // Handshake is done - write data as normal<a name="line.210"></a>
<span class="sourceLineNo">211</span>                nextFilter.filterWrite(session, writeRequest);<a name="line.211"></a>
<span class="sourceLineNo">212</span>            } else if (isHandshakeData) {<a name="line.212"></a>
<span class="sourceLineNo">213</span>                LOGGER.debug("   handshake data: {}", writeRequest.getMessage());<a name="line.213"></a>
<span class="sourceLineNo">214</span><a name="line.214"></a>
<span class="sourceLineNo">215</span>                // Writing handshake data<a name="line.215"></a>
<span class="sourceLineNo">216</span>                nextFilter.filterWrite(session, writeRequest);<a name="line.216"></a>
<span class="sourceLineNo">217</span>            } else {<a name="line.217"></a>
<span class="sourceLineNo">218</span>                // Writing non-handshake data before the handshake finished<a name="line.218"></a>
<span class="sourceLineNo">219</span>                if (!session.isConnected()) {<a name="line.219"></a>
<span class="sourceLineNo">220</span>                    // Not even connected - ignore<a name="line.220"></a>
<span class="sourceLineNo">221</span>                    LOGGER.debug(" Write request on closed session. Request ignored.");<a name="line.221"></a>
<span class="sourceLineNo">222</span>                } else {<a name="line.222"></a>
<span class="sourceLineNo">223</span>                    // Queue the data to be sent as soon as the handshake completes<a name="line.223"></a>
<span class="sourceLineNo">224</span>                    LOGGER.debug(" Handshaking is not complete yet. Buffering write request.");<a name="line.224"></a>
<span class="sourceLineNo">225</span>                    handler.enqueueWriteRequest(nextFilter, writeRequest);<a name="line.225"></a>
<span class="sourceLineNo">226</span>                }<a name="line.226"></a>
<span class="sourceLineNo">227</span>            }<a name="line.227"></a>
<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>    /**<a name="line.231"></a>
<span class="sourceLineNo">232</span>     * Filter handshake related messages from reaching the messageSent callbacks of <a name="line.232"></a>
<span class="sourceLineNo">233</span>     * downstream filters.<a name="line.233"></a>
<span class="sourceLineNo">234</span>     * <a name="line.234"></a>
<span class="sourceLineNo">235</span>     * @param nextFilter the next filter in filter chain<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * @param session the session object<a name="line.236"></a>
<span class="sourceLineNo">237</span>     * @param writeRequest the data written<a name="line.237"></a>
<span class="sourceLineNo">238</span>     */<a name="line.238"></a>
<span class="sourceLineNo">239</span>    @Override<a name="line.239"></a>
<span class="sourceLineNo">240</span>    public void messageSent(final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest)<a name="line.240"></a>
<span class="sourceLineNo">241</span>            throws Exception {<a name="line.241"></a>
<span class="sourceLineNo">242</span>        if (writeRequest.getMessage() != null &amp;&amp; writeRequest.getMessage() instanceof ProxyHandshakeIoBuffer) {<a name="line.242"></a>
<span class="sourceLineNo">243</span>            // Ignore buffers used in handshaking<a name="line.243"></a>
<span class="sourceLineNo">244</span>            return;<a name="line.244"></a>
<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
<span class="sourceLineNo">246</span><a name="line.246"></a>
<span class="sourceLineNo">247</span>        nextFilter.messageSent(session, writeRequest);<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>    /**<a name="line.250"></a>
<span class="sourceLineNo">251</span>     * Called when the session is created. Will create the handler able to handle<a name="line.251"></a>
<span class="sourceLineNo">252</span>     * the {@link ProxyIoSession#getRequest()} request stored in the session. Event<a name="line.252"></a>
<span class="sourceLineNo">253</span>     * is stored in an {@link IoSessionEventQueue} for later delivery to the next filter<a name="line.253"></a>
<span class="sourceLineNo">254</span>     * in the chain when the handshake would have succeed. This will prevent the rest of <a name="line.254"></a>
<span class="sourceLineNo">255</span>     * the filter chain from being affected by this filter internals. <a name="line.255"></a>
<span class="sourceLineNo">256</span>     * <a name="line.256"></a>
<span class="sourceLineNo">257</span>     * Please note that this event can occur multiple times because of some http <a name="line.257"></a>
<span class="sourceLineNo">258</span>     * proxies not handling keep-alive connections thus needing multiple sessions <a name="line.258"></a>
<span class="sourceLineNo">259</span>     * during the handshake.<a name="line.259"></a>
<span class="sourceLineNo">260</span>     * <a name="line.260"></a>
<span class="sourceLineNo">261</span>     * @param nextFilter the next filter in filter chain<a name="line.261"></a>
<span class="sourceLineNo">262</span>     * @param session the session object<a name="line.262"></a>
<span class="sourceLineNo">263</span>     */<a name="line.263"></a>
<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
<span class="sourceLineNo">265</span>    public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {<a name="line.265"></a>
<span class="sourceLineNo">266</span>        LOGGER.debug("Session created: " + session);<a name="line.266"></a>
<span class="sourceLineNo">267</span>        ProxyIoSession proxyIoSession = (ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.267"></a>
<span class="sourceLineNo">268</span>        LOGGER.debug("  get proxyIoSession: " + proxyIoSession);<a name="line.268"></a>
<span class="sourceLineNo">269</span>        proxyIoSession.setProxyFilter(this);<a name="line.269"></a>
<span class="sourceLineNo">270</span><a name="line.270"></a>
<span class="sourceLineNo">271</span>        // Create a HTTP proxy handler and start handshake.<a name="line.271"></a>
<span class="sourceLineNo">272</span>        ProxyLogicHandler handler = proxyIoSession.getHandler();<a name="line.272"></a>
<span class="sourceLineNo">273</span><a name="line.273"></a>
<span class="sourceLineNo">274</span>        // This test prevents from loosing handler conversationnal state when<a name="line.274"></a>
<span class="sourceLineNo">275</span>        // reconnection occurs during an http handshake.<a name="line.275"></a>
<span class="sourceLineNo">276</span>        if (handler == null) {<a name="line.276"></a>
<span class="sourceLineNo">277</span>            ProxyRequest request = proxyIoSession.getRequest();<a name="line.277"></a>
<span class="sourceLineNo">278</span><a name="line.278"></a>
<span class="sourceLineNo">279</span>            if (request instanceof SocksProxyRequest) {<a name="line.279"></a>
<span class="sourceLineNo">280</span>                SocksProxyRequest req = (SocksProxyRequest) request;<a name="line.280"></a>
<span class="sourceLineNo">281</span>                if (req.getProtocolVersion() == SocksProxyConstants.SOCKS_VERSION_4) {<a name="line.281"></a>
<span class="sourceLineNo">282</span>                    handler = new Socks4LogicHandler(proxyIoSession);<a name="line.282"></a>
<span class="sourceLineNo">283</span>                } else {<a name="line.283"></a>
<span class="sourceLineNo">284</span>                    handler = new Socks5LogicHandler(proxyIoSession);<a name="line.284"></a>
<span class="sourceLineNo">285</span>                }<a name="line.285"></a>
<span class="sourceLineNo">286</span>            } else {<a name="line.286"></a>
<span class="sourceLineNo">287</span>                handler = new HttpSmartProxyHandler(proxyIoSession);<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>            proxyIoSession.setHandler(handler);<a name="line.290"></a>
<span class="sourceLineNo">291</span>            handler.doHandshake(nextFilter);<a name="line.291"></a>
<span class="sourceLineNo">292</span>        }<a name="line.292"></a>
<span class="sourceLineNo">293</span><a name="line.293"></a>
<span class="sourceLineNo">294</span>        proxyIoSession.getEventQueue().enqueueEventIfNecessary(<a name="line.294"></a>
<span class="sourceLineNo">295</span>                new IoSessionEvent(nextFilter, session, IoSessionEventType.CREATED));<a name="line.295"></a>
<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
<span class="sourceLineNo">297</span><a name="line.297"></a>
<span class="sourceLineNo">298</span>    /**<a name="line.298"></a>
<span class="sourceLineNo">299</span>     * Event is stored in an {@link IoSessionEventQueue} for later delivery to the next filter<a name="line.299"></a>
<span class="sourceLineNo">300</span>     * in the chain when the handshake would have succeed. This will prevent the rest of <a name="line.300"></a>
<span class="sourceLineNo">301</span>     * the filter chain from being affected by this filter internals.<a name="line.301"></a>
<span class="sourceLineNo">302</span>     * <a name="line.302"></a>
<span class="sourceLineNo">303</span>     * @param nextFilter the next filter in filter chain<a name="line.303"></a>
<span class="sourceLineNo">304</span>     * @param session the session object<a name="line.304"></a>
<span class="sourceLineNo">305</span>     */<a name="line.305"></a>
<span class="sourceLineNo">306</span>    @Override<a name="line.306"></a>
<span class="sourceLineNo">307</span>    public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {<a name="line.307"></a>
<span class="sourceLineNo">308</span>        ProxyIoSession proxyIoSession = (ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.308"></a>
<span class="sourceLineNo">309</span>        proxyIoSession.getEventQueue().enqueueEventIfNecessary(<a name="line.309"></a>
<span class="sourceLineNo">310</span>                new IoSessionEvent(nextFilter, session, IoSessionEventType.OPENED));<a name="line.310"></a>
<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
<span class="sourceLineNo">312</span><a name="line.312"></a>
<span class="sourceLineNo">313</span>    /**<a name="line.313"></a>
<span class="sourceLineNo">314</span>     * Event is stored in an {@link IoSessionEventQueue} for later delivery to the next filter<a name="line.314"></a>
<span class="sourceLineNo">315</span>     * in the chain when the handshake would have succeed. This will prevent the rest of <a name="line.315"></a>
<span class="sourceLineNo">316</span>     * the filter chain from being affected by this filter internals.<a name="line.316"></a>
<span class="sourceLineNo">317</span>     * <a name="line.317"></a>
<span class="sourceLineNo">318</span>     * @param nextFilter the next filter in filter chain<a name="line.318"></a>
<span class="sourceLineNo">319</span>     * @param session the session object<a name="line.319"></a>
<span class="sourceLineNo">320</span>     */<a name="line.320"></a>
<span class="sourceLineNo">321</span>    @Override<a name="line.321"></a>
<span class="sourceLineNo">322</span>    public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {<a name="line.322"></a>
<span class="sourceLineNo">323</span>        ProxyIoSession proxyIoSession = (ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.323"></a>
<span class="sourceLineNo">324</span>        proxyIoSession.getEventQueue().enqueueEventIfNecessary(new IoSessionEvent(nextFilter, session, status));<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>
<span class="sourceLineNo">327</span>    /**<a name="line.327"></a>
<span class="sourceLineNo">328</span>     * Event is stored in an {@link IoSessionEventQueue} for later delivery to the next filter<a name="line.328"></a>
<span class="sourceLineNo">329</span>     * in the chain when the handshake would have succeed. This will prevent the rest of <a name="line.329"></a>
<span class="sourceLineNo">330</span>     * the filter chain from being affected by this filter internals.<a name="line.330"></a>
<span class="sourceLineNo">331</span>     * <a name="line.331"></a>
<span class="sourceLineNo">332</span>     * @param nextFilter the next filter in filter chain<a name="line.332"></a>
<span class="sourceLineNo">333</span>     * @param session the session object<a name="line.333"></a>
<span class="sourceLineNo">334</span>     */<a name="line.334"></a>
<span class="sourceLineNo">335</span>    @Override<a name="line.335"></a>
<span class="sourceLineNo">336</span>    public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {<a name="line.336"></a>
<span class="sourceLineNo">337</span>        ProxyIoSession proxyIoSession = (ProxyIoSession) session.getAttribute(ProxyIoSession.PROXY_SESSION);<a name="line.337"></a>
<span class="sourceLineNo">338</span>        proxyIoSession.getEventQueue().enqueueEventIfNecessary(<a name="line.338"></a>
<span class="sourceLineNo">339</span>                new IoSessionEvent(nextFilter, session, IoSessionEventType.CLOSED));<a name="line.339"></a>
<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
<span class="sourceLineNo">341</span>}<a name="line.341"></a>




























































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