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   +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)socketZ	inet_ptonZAF_INET6Z	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socksZcreate_connectionhostporttimeoutr   ZIPPROTO_TCPZ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)Zserver_hostname)r   r'   Z_contextZwrap_socketr%   r    Zcheck_hostnameZ_check_hostnamesslZmatch_hostnameZgetpeercert	ExceptionZshutdownr   Z	SHUT_RDWRclose)r   r   r   r   r'   H   s    

zSocksiPyConnectionS.connect)NTNN)r(   r)   r*   r   r'   r   r   r   r   r+   C   s   
r+   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	   r1   r   r   )r    r!   r"   r   r1   conn)r   r   r   buildZ   s    z(SocksiPyHandler.http_open.<locals>.build)Nr   )do_open)r   reqr5   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	   r1   r+   r   )r    r!   r"   r   r1   r4   )r   r   r   r5   a   s    z)SocksiPyHandler.https_open.<locals>.build)Nr   )r6   )r   r7   r5   r   )r   r   
https_open`   s    zSocksiPyHandler.https_openN)r(   r)   r*   r   r8   r9   r   r   r   r   r0   S   s   r0   __main__r   iZ#  Z	localhostzHTTP: zhttp://httpbin.org/ipzHTTPS: zhttps://httpbin.org/ip)$__doc__r   r-   r2   r   ImportErrorZurllib.requestZrequestZhttp.clientZclientr   r	   r   setr   r   r   r,   r+   r3   ZHTTPSHandlerr0   r(   sysintargvr!   
ValueError
IndexErrorZbuild_openerZPROXY_TYPE_SOCKS5openerprintopenreaddecoder   r   r   r   <module>	   s0   

