a
    ñ»j~  ã                	   @   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   ú2E:\soccer\ml_env\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 q®W q tj
yª } z8|r”dt|ƒv r”t| jƒs”d}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   

