U
    g
c~                  	   @   s<  d Z ddlZddlZz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z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.8/site-packages/sockshandler.py
merge_dict   s    
r
   c                 C   sN   z6d| krt t j|  nd| kr.t |  nW dS W n   Y dS X 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 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k}z:t| j| jf| jd ||||||tjtj	dff
}W qW q tj
k
r } z0|rdt|krt| jsd}t| n W 5 d }~X Y qX q|| _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 r   )r   r   HTTPSConnectionr   r   r   r   r	   r   D   s    zSocksiPyConnectionS.__init__c                 C   sz   t |  | jj| j| jd| _| jjsv| jrvz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)NTNNr*   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 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
   r5   r   r   r"   r#   r$   r   r5   Zconnr3   r   r	   buildZ   s    z(SocksiPyHandler.http_open.<locals>.build)Nr   Zdo_openr   Zreqr:   r   r3   r	   	http_openY   s    zSocksiPyHandler.http_openc                    s   d fdd	}  ||S )Nr   c                    s(   t  j|}t j| ||d|}|S r8   )r
   r5   r.   r   r9   r3   r   r	   r:   a   s    z)SocksiPyHandler.https_open.<locals>.build)Nr   r;   r<   r   r3   r	   
https_open`   s    zSocksiPyHandler.https_openN)r+   r,   r-   r   r=   r>   r   r   r   r	   r4   S   s   r4   __main__r   iZ#  Z	localhostzHTTP: zhttp://httpbin.org/ipzHTTPS: zhttps://httpbin.org/ip)$__doc__r   r0   r6   r   ImportErrorZurllib.requestZrequestZhttp.clientZclientr!   r
   r   setr    r   r   r/   r.   r7   ZHTTPSHandlerr4   r+   sysintargvr#   
ValueError
IndexErrorZbuild_openerZPROXY_TYPE_SOCKS5Zopenerprintopenreaddecoder   r   r   r	   <module>   s0   

