ó
    ê7i~  ã                   ó”  • S r SSKrSSKr SSKrSSKrSSK
r
S rS r\" 5       r " S S\R                  5      r " S S\R"                  5      r " S	 S
\R&                  \R(                  5      r\S:X  a«  SSKr \" \R2                  S   5      r\R:                  " \" \
R<                  S\5      5      r\ " S\RC                  S5      RE                  5       RG                  5       -   5        \ " S\RC                  S5      RE                  5       RG                  5       -   5        gg! \ a    SSKJr  SSKJ	r   GN"f = f! \\4 a    Sr N·f = f)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                 óH   • U R                  5       nUR                  U5        U$ ©N)ÚcopyÚupdate)ÚaÚbÚds      Ú!Lib\site-packages\sockshandler.pyÚ
merge_dictr      s   € Ø	�‰‹€AØ‡H�HˆQ„KØ€Hó    c                 ó¦   •  SU ;   a&  [         R                  " [         R                  U 5        gSU ;   a  [         R                  " U 5        gg!    g= f)NÚ:Ú.FT)ÚsocketÚ	inet_ptonÚAF_INET6Ú	inet_aton)Úss    r
   Úis_ipr      sR   € ð
Ø�!‹8Ü×ÒœVŸ_™_¨aÔ0ð ð �A‹XÜ×Ò˜QÔð ð	 øðÙús   ‚+A ®A ÁAc                   ó$   • \ rS rSrSS jrS rSrg)ÚSocksiPyConnectioné*   Nc                 ó`   • XX4XV4U l         [        R                  R                  " U /UQ70 UD6  g r   )Ú	proxyargsÚhttplibÚHTTPConnectionÚ__init__©	ÚselfÚ	proxytypeÚ	proxyaddrÚ	proxyportÚrdnsÚusernameÚpasswordÚargsÚkwargss	            r
   r   ÚSocksiPyConnection.__init__+   s.   € Ø#°	ÀÐTˆŒÜ×Ñ×'Ò'¨Ð>¨tÒ>°vÓ>r   c                 óè  • U R                   u  pp4pVU=(       a	    U[        ;  n  [        R                  " U R                  U R
                  4U R                  S XX4XV[        R                  [        R                  S445
      n Xpl        g ! [        R                   aR  nU(       aE  S[        U5      ;   a6  [        U R                  5      (       d  Sn[        R                  U5         S nAO	e S nAff = fMÐ  )Né   Ú0x5bF)r   Úsocks4_no_rdnsÚsocksÚcreate_connectionÚhostÚportÚtimeoutr   ÚIPPROTO_TCPÚTCP_NODELAYÚSOCKS4ErrorÚstrr   ÚaddÚsock)	r   r    r!   r"   r#   r$   r%   r7   Úes	            r
   ÚconnectÚSocksiPyConnection.connect/   sÒ   € ØFJÇnÁnÑCˆ˜y°Ø×7˜	¬Ñ7ˆØðÜ×.Ò.Ø—Y‘Y §	¡	Ð*¨D¯L©L¸$Ø¨)¸8Ü×(Ñ(¬&×*<Ñ*<¸aÐ@ÐBóD�ð ð �	øô ×$Ñ$ó Þ˜F¤c¨!£fÓ,´U¸4¿9¹9×5EÑ5Eð !�DÜ"×&Ñ& y×1Ñ1àûðúñ s   ¥AB	 Â	C/ÂAC*Ã)C*Ã*C/©r   r7   ©NTNN©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r9   Ú__static_attributes__© r   r
   r   r   *   s   † ô?õr   r   c                   ó$   • \ rS rSrSS jrS rSrg)ÚSocksiPyConnectionSéC   Nc                 ó`   • XX4XV4U l         [        R                  R                  " U /UQ70 UD6  g r   )r   r   ÚHTTPSConnectionr   r   s	            r
   r   ÚSocksiPyConnectionS.__init__D   s.   € Ø#°	ÀÐTˆŒÜ×Ñ×(Ò(¨Ð?°Ò?¸Ó?r   c                 ó  • [         R                  U 5        U R                  R                  U R                  U R
                  S9U l        U R                  R                  (       dM  U R                  (       a;   [        R                  " U R                  R                  5       U R
                  5        g g g ! [         aE    U R                  R                  [        R                  5        U R                  R                  5         e f = f)N)Úserver_hostname)r   r9   Ú_contextÚwrap_socketr7   r/   Úcheck_hostnameÚ_check_hostnameÚsslÚmatch_hostnameÚgetpeercertÚ	ExceptionÚshutdownr   Ú	SHUT_RDWRÚclose)r   s    r
   r9   ÚSocksiPyConnectionS.connectH   s±   € Ü×"Ñ" 4Ô(Ø—M‘M×-Ñ-¨d¯i©iÈÏÉÐ-ÐSˆŒ	Ø�}‰}×+×+°×0D×0DðÜ×"Ò" 4§9¡9×#8Ñ#8Ó#:¸D¿I¹IÕFð 1EÐ+øô ó Ø—	‘	×"Ñ"¤6×#3Ñ#3Ô4Ø—	‘	—‘Ô!Øðús   Á69B2 Â2ADr;   r<   r=   rC   r   r
   rE   rE   C   s   † ô@õ	r   rE   c                   ó&   • \ rS rSrS rS rS rSrg)ÚSocksiPyHandleréS   c                 óZ   • Xl         X l        [        R                  R	                  U 5        g r   )r&   ÚkwÚurllib2ÚHTTPHandlerr   )r   r&   r'   s      r
   r   ÚSocksiPyHandler.__init__T   s    € ØŒ	ØŒÜ×Ñ×$Ñ$ TÕ*r   c                 ó6   ^ • SU 4S jjnT R                  X!5      $ )Nc                 ód   >• [        TR                  U5      n[        TR                  XUS.UD6nU$ ©N)r/   r0   r1   )r   r\   r   r&   ©r/   r0   r1   r'   r\   Úconnr   s         €r
   ÚbuildÚ(SocksiPyHandler.http_open.<locals>.buildZ   s1   ø€ Ü˜DŸG™G VÓ,ˆBÜ% t§y¡y°tÐPWÑ^Ð[]Ñ^ˆDØˆKr   ©Nr   ©Údo_open©r   Úreqre   s   `  r
   Ú	http_openÚSocksiPyHandler.http_openY   ó   ø€ ÷	ð �|‰|˜EÓ'Ð'r   c                 ó6   ^ • SU 4S jjnT R                  X!5      $ )Nc                 ód   >• [        TR                  U5      n[        TR                  XUS.UD6nU$ rb   )r   r\   rE   r&   rc   s         €r
   re   Ú)SocksiPyHandler.https_open.<locals>.builda   s1   ø€ Ü˜DŸG™G VÓ,ˆBÜ&¨¯	©	¸ÐQXÑ_Ð\^Ñ_ˆDØˆKr   rg   rh   rj   s   `  r
   Ú
https_openÚSocksiPyHandler.https_open`   rn   r   )r&   r\   N)r>   r?   r@   rA   r   rl   rr   rB   rC   r   r
   rY   rY   S   s   † ò+ò
(õ(r   rY   Ú__main__r*   iZ#  Ú	localhostzHTTP: zhttp://httpbin.org/ipzHTTPS: zhttps://httpbin.org/ip)$Ú__doc__r   rP   r]   r   ÚImportErrorÚurllib.requestÚrequestÚhttp.clientÚclientr-   r   r   Úsetr,   r   r   rH   rE   r^   ÚHTTPSHandlerrY   r>   ÚsysÚintÚargvr0   Ú
ValueErrorÚ
IndexErrorÚbuild_openerÚPROXY_TYPE_SOCKS5ÚopenerÚprintÚopenÚreadÚdecoderC   r   r
   Ú<module>rŠ      sF  ðñó Û 
ð"ÛÛó
 òò
ñ “€ô˜×/Ñ/ô ô2˜'×1Ñ1ô ô (�g×)Ñ)¨7×+?Ñ+?ô (ð( ˆzÓÛðÙ�3—8‘8˜A‘;Óˆð ×!Ò!¡/°%×2IÑ2IÈ;ÐX\Ó"]Ó^€FÙ	ˆ(�V—[‘[Ð!8Ó9×>Ñ>Ó@×GÑGÓIÑ
IÔJÙ	ˆ)�f—k‘kÐ":Ó;×@Ñ@ÓB×IÑIÓKÑ
KÕLð øðo ó "Ý$ß!Ð!ð"ûðv ˜
Ð#ó ØŠðús#   ŒD! Á:D: Ä!D7Ä6D7Ä:
EÅE