Can you open a JIRA for this ?

Thanks
Jeff

On Fri, Sep 26, 2014 at 9:57 AM, Michael Reinecke <
[email protected]> wrote:

> Hello devs,
>
> we are using Mina 2.0.7 to access an server through an Socks5 proxy. This
> worked fine as long as we use a direct IP address of the endpoint, but once
> we use the computer name, a nullpointer exception would occur. I searched
> through the source code and found the cause.
> If Java can not resolve the computer name, then the handler will switch to
> the else branch, which tries to access the host value from the request. But
> to construct the Socks5 Request, you HAVE to set an INetAddress and CAN NOT
> set the host directly.
> One feature of Socks5 is the ability to resolve the hostname by the proxy
> which may not be resolvable by others and therefor it is not required to
> resolve the name on our side. So the fastest way to fix this was to add the
> green code in the else branch.
>
> I am sure there are smarter ways to handle this problem, like extracting
> the host name in the SocksProxyRequest constructor and set it to the host
> variable. But as far as I do not know the complete infrastructure of MINA
> and the resulting consequences, I used this approach ;).
>
> Yours,
> Michael Reinecke
>
> <...>
> SocksProxyRequest  soxx = new SocksProxyRequest(
>
>                     SocksProxyConstants.SOCKS_VERSION_5,
>
>                     SocksProxyConstants.ESTABLISH_TCPIP_STREAM,
>
>                     new InetSocketAddress("endpoint-name", 666),
>
>                     "username");
> <...>
>
>
> package org.apache.mina.proxy.handlers.socks;
> <...>
> public class Socks5LogicHandler extends AbstractSocksLogicHandler {
> <...>
>     private IoBuffer encodeProxyRequestPacket(final SocksProxyRequest
> request) throws UnsupportedEncodingException {
>         int len = 6;
>         InetSocketAddress adr = request.getEndpointAddress();
>         byte addressType = 0;
>         byte[] host = null;
>
>         if (adr != null && !adr.isUnresolved()) {
>             if (adr.getAddress() instanceof Inet6Address) {
>                 len += 16;
>                 addressType = SocksProxyConstants.IPV6_ADDRESS_TYPE;
>             } else if (adr.getAddress() instanceof Inet4Address) {
>                 len += 4;
>                 addressType = SocksProxyConstants.IPV4_ADDRESS_TYPE;
>             }
>         } else {
>             host = request.getHost() != null ?
> request.getHost().getBytes("ASCII") : null;
>             //The proxy will take care of the destination in Socks5
>             if(host == null && adr != null){
>                 host = adr.getHostName().getBytes("ASCII");
>             }
>             if (host != null) {
>                 len += 1 + host.length;
>                 addressType = SocksProxyConstants.DOMAIN_NAME_ADDRESS_TYPE;
>             } else {
>                 throw new IllegalArgumentException("SocksProxyRequest
> object " + "has no suitable endpoint information");
>             }
>         }
> <...>
>     }
>



-- 
Jeff MAURY


"Legacy code" often differs from its suggested alternative by actually
working and scaling.
 - Bjarne Stroustrup

http://www.jeffmaury.com
http://riadiscuss.jeffmaury.com
http://www.twitter.com/jeffmaury

Reply via email to