B
    /b~              	   @   s<  d Z ddlZddlZyddlZddlZW n, ek
rT   ddlmZ ddlm	Z Y nX ddl
Z
dd Zdd Ze ZG dd dejZG d	d
 d
ejZG dd dejejZedkr8ddlZyeejd ZW n eefk
r   dZY nX eee
jdeZe de!d" #   e de!d" #   dS )z
SocksiPy + urllib2 handler

version: 0.3
author: e<e@tr0ll.in>

This module provides a Handler which you can use with urllib2 to allow it to tunnel your connection through a socks.sockssocket socket, with out monkey patching the original socket...
    Nc             C   s   |   }|| |S )N)copyupdate)abd r   0/usr/lib/python3.7/site-packages/sockshandler.py
merge_dict   s    
r	   c             C   sH   y4d| krt t j|  nd| kr.t |  ndS W n
   dS dS d S )N:.FT)socket	inet_ptonAF_INET6	inet_aton)sr   r   r   is_ip   s    r   c               @   s   e Zd ZdddZdd ZdS )SocksiPyConnectionNTc       	      O   s*   ||||||f| _ tjj| f|| d S )N)	proxyargshttplibHTTPConnection__init__)	self	proxytype	proxyaddr	proxyportrdnsusernamepasswordargskwargsr   r   r   r   +   s    zSocksiPyConnection.__init__c       	      C   s   | j \}}}}}}|o|tk}xy8t| j| jf| jd ||||||tjtj	dff
}P W q  tj
k
r } z0|rdt|krt| jsd}t| n W d d }~X Y q X q W || _d S )N   Z0x5bF)r   socks4_no_rdnssockscreate_connectionhostporttimeoutr   IPPROTO_TCPTCP_NODELAYZSOCKS4Errorstrr   addsock)	r   r   r   r   r   r   r   r+   er   r   r   connect/   s    zSocksiPyConnection.connect)NTNN)__name__
__module____qualname__r   r-   r   r   r   r   r   *   s   
r   c               @   s   e Zd ZdddZdd ZdS )SocksiPyConnectionSNTc       	      O   s*   ||||||f| _ tjj| f|| d S )N)r   r   HTTPSConnectionr   )	r   r   r   r   r   r   r   r   r   r   r   r   r   D   s    zSocksiPyConnectionS.__init__c             C   sz   t |  | jj| j| jd| _| jjsv| jrvyt	| j
 | j W n. tk
rt   | jtj | j   Y nX d S )N)server_hostname)r   r-   _contextwrap_socketr+   r$   check_hostname_check_hostnamesslmatch_hostnamegetpeercert	Exceptionshutdownr   	SHUT_RDWRclose)r   r   r   r   r-   H   s    

zSocksiPyConnectionS.connect)NTNN)r.   r/   r0   r   r-   r   r   r   r   r1   C   s   
r1   c               @   s$   e Zd Zdd Zdd Zdd ZdS )SocksiPyHandlerc             O   s   || _ || _tj|  d S )N)r   kwurllib2HTTPHandlerr   )r   r   r   r   r   r   r   T   s    zSocksiPyHandler.__init__c                s   d fdd	}  ||S )Nr   c                s(   t  j|}t j| ||d|}|S )N)r$   r%   r&   )r	   r@   r   r   )r$   r%   r&   r   r@   conn)r   r   r   buildZ   s    z(SocksiPyHandler.http_open.<locals>.build)Nr   )do_open)r   reqrD   r   )r   r   	http_openY   s    zSocksiPyHandler.http_openc                s   d fdd	}  ||S )Nr   c                s(   t  j|}t j| ||d|}|S )N)r$   r%   r&   )r	   r@   r1   r   )r$   r%   r&   r   r@   rC   )r   r   r   rD   a   s    z)SocksiPyHandler.https_open.<locals>.build)Nr   )rE   )r   rF   rD   r   )r   r   
https_open`   s    zSocksiPyHandler.https_openN)r.   r/   r0   r   rG   rH   r   r   r   r   r?   S   s   r?   __main__r    iZ#  	localhostzHTTP: zhttp://httpbin.org/ipzHTTPS: zhttps://httpbin.org/ip)$__doc__r   r8   rA   r   ImportErrorurllib.requestrequesthttp.clientclientr"   r	   r   setr!   r   r   r2   r1   rB   HTTPSHandlerr?   r.   sysintargvr%   
ValueError
IndexErrorbuild_openerZPROXY_TYPE_SOCKS5openerprintopenreaddecoder   r   r   r   <module>	   s0   

