ó
Ý‰]c           @   s”  d  Z  d d l Z d d l Z y d d l Z d d l Z Wn/ e k
 rk d d l j Z d d l j	 Z n Xd d l
 Z
 d „  Z d „  Z e ƒ  Z d e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d	 e j e j f d
 „  ƒ  YZ e d k rd d l Z y e e j d ƒ Z Wn e e f k
 r2d Z n Xe j e e
 j d e ƒ ƒ Z d e j  d ƒ j! ƒ  j" ƒ  GHd e j  d ƒ j! ƒ  j" ƒ  GHn  d S(   sù   
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...
iÿÿÿÿNc         C   s   |  j  ƒ  } | j | ƒ | S(   N(   t   copyt   update(   t   at   bt   d(    (    s+   lib/python2.7/site-packages/sockshandler.pyt
   merge_dict   s    c         C   sY   yF d |  k r% t  j t  j |  ƒ n  d |  k rA t  j |  ƒ n t SWn t SXt Sd  S(   Nt   :t   .(   t   sockett	   inet_ptont   AF_INET6t	   inet_atont   Falset   True(   t   s(    (    s+   lib/python2.7/site-packages/sockshandler.pyt   is_ip   s    t   SocksiPyConnectionc           B   s&   e  Z d e d d d  „ Z d „  Z RS(   c   	      O   s5   | | | | | | f |  _  t j j |  | | Ž d  S(   N(   t	   proxyargst   httplibt   HTTPConnectiont   __init__(	   t   selft	   proxytypet	   proxyaddrt	   proxyportt   rdnst   usernamet   passwordt   argst   kwargs(    (    s+   lib/python2.7/site-packages/sockshandler.pyR   +   s    c   	      C   sñ   |  j  \ } } } } } } | o* | t k } x´ t rã yP t j |  j |  j f |  j d  | | | | | | t	 j
 t	 j d f f ƒ
 } PWq0 t j k
 rß } | rÙ d t | ƒ k rÙ t |  j ƒ rÙ t } t j | ƒ qà ‚  q0 Xq0 W| |  _ d  S(   Ni   t   0x5b(   R   t   socks4_no_rdnsR   t   sockst   create_connectiont   hostt   portt   timeoutt   NoneR   t   IPPROTO_TCPt   TCP_NODELAYt   SOCKS4Errort   strR   R   t   addt   sock(	   R   R   R   R   R   R   R   R+   t   e(    (    s+   lib/python2.7/site-packages/sockshandler.pyt   connect/   s    	(N(   t   __name__t
   __module__R%   R   R   R-   (    (    (    s+   lib/python2.7/site-packages/sockshandler.pyR   *   s   t   SocksiPyConnectionSc           B   s&   e  Z d e d d d  „ Z d „  Z RS(   c   	      O   s5   | | | | | | f |  _  t j j |  | | Ž d  S(   N(   R   R   t   HTTPSConnectionR   (	   R   R   R   R   R   R   R   R   R   (    (    s+   lib/python2.7/site-packages/sockshandler.pyR   D   s    c         C   s¢   t  j |  ƒ |  j j |  j d |  j ƒ|  _ |  j j rž |  j rž y  t j	 |  j j
 ƒ  |  j ƒ Wqž t k
 rš |  j j t j ƒ |  j j ƒ  ‚  qž Xn  d  S(   Nt   server_hostname(   R   R-   t   _contextt   wrap_socketR+   R"   t   check_hostnamet   _check_hostnamet   sslt   match_hostnamet   getpeercertt	   Exceptiont   shutdownR   t	   SHUT_RDWRt   close(   R   (    (    s+   lib/python2.7/site-packages/sockshandler.pyR-   H   s    ! N(   R.   R/   R%   R   R   R-   (    (    (    s+   lib/python2.7/site-packages/sockshandler.pyR0   C   s   t   SocksiPyHandlerc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         O   s&   | |  _  | |  _ t j j |  ƒ d  S(   N(   R   t   kwt   urllib2t   HTTPHandlerR   (   R   R   R   (    (    s+   lib/python2.7/site-packages/sockshandler.pyR   T   s    		c            s%   d  d ‡  f d † } ˆ  j | | ƒ S(   Ni    c      	      s:   t  ˆ  j | ƒ } t d |  d | d | ˆ  j | Ž } | S(   NR"   R#   R$   (   R   R?   R   R   (   R"   R#   R$   R   R?   t   conn(   R   (    s+   lib/python2.7/site-packages/sockshandler.pyt   buildZ   s    $(   R%   t   do_open(   R   t   reqRC   (    (   R   s+   lib/python2.7/site-packages/sockshandler.pyt	   http_openY   s    c            s%   d  d ‡  f d † } ˆ  j | | ƒ S(   Ni    c      	      s:   t  ˆ  j | ƒ } t d |  d | d | ˆ  j | Ž } | S(   NR"   R#   R$   (   R   R?   R0   R   (   R"   R#   R$   R   R?   RB   (   R   (    s+   lib/python2.7/site-packages/sockshandler.pyRC   a   s    $(   R%   RD   (   R   RE   RC   (    (   R   s+   lib/python2.7/site-packages/sockshandler.pyt
   https_open`   s    (   R.   R/   R   RF   RG   (    (    (    s+   lib/python2.7/site-packages/sockshandler.pyR>   S   s   		t   __main__i   iZ#  t	   localhosts   HTTP: s   http://httpbin.org/ips   HTTPS: s   https://httpbin.org/ip(#   t   __doc__R   R7   R@   R   t   ImportErrort   urllib.requestt   requestt   http.clientt   clientR    R   R   t   setR   R   R   R1   R0   RA   t   HTTPSHandlerR>   R.   t   syst   intt   argvR#   t
   ValueErrort
   IndexErrort   build_openert   PROXY_TYPE_SOCKS5t   openert   opent   readt   decode(    (    (    s+   lib/python2.7/site-packages/sockshandler.pyt   <module>	   s0   			
