a
    |f~                  	   @   s8  d Z ddlZddlZzddlZddlZW n* eyR   ddlmZ ddlm	Z Y n0 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r4ddlZzeejd ZW n eefy   dZY n0 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   FD:\Projects\storyit_web\backend\venv\Lib\site-packages\sockshandler.py
merge_dict   s    
r
   c                 C   sN   z6d| v rt t j|  nd| v r.t |  nW dS W n   Y dS 0 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   s0   ||||||f| _ tjj| g|R i | d S r   )	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v}z:t| j| jf| jd ||||||tjtj	dff
}W qW q tj
y } z8|rdt|v rt| jsd}t| n W Y d }~qd }~0 0 q|| _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   s0   ||||||f| _ tjj| g|R i | d S r   )r   r   HTTPSConnectionr   r   r   r   r	   r   D   s    zSocksiPyConnectionS.__init__c                 C   sx   t |  | jj| j| jd| _| jjst| jrtzt	| j
 | j W n, tyr   | jtj | j   Y n0 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)NTNNr0   r   r   r   r	   r4   C   s   
r4   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SocksiPyHandlerc                 O   s   || _ || _tj|  d S r   )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
   rD   r   r    r&   r'   r(   r!   rD   connrB   r   r	   buildZ   s    z(SocksiPyHandler.http_open.<locals>.build)Nr   do_openr   reqrJ   r   rB   r	   	http_openY   s    zSocksiPyHandler.http_openc                    s   d fdd	}  ||S )Nr   c                    s(   t  j|}t j| ||d|}|S rG   )r
   rD   r4   r    rH   rB   r   r	   rJ   a   s    z)SocksiPyHandler.https_open.<locals>.build)Nr   rK   rM   r   rB   r	   
https_open`   s    zSocksiPyHandler.https_openN)r1   r2   r3   r   rO   rP   r   r   r   r	   rC   S   s   rC   __main__r"   iZ#  	localhostzHTTP: zhttp://httpbin.org/ipzHTTPS: zhttps://httpbin.org/ip)$__doc__r   r;   rE   r   ImportErrorurllib.requestrequesthttp.clientclientr$   r
   r   setr#   r   r   r5   r4   rF   HTTPSHandlerrC   r1   sysintargvr'   
ValueError
IndexErrorbuild_openerZPROXY_TYPE_SOCKS5openerprintopenreaddecoder   r   r   r	   <module>   s0   

