ó
z\Vc           @   s   d  Z  d d l Z d d l Td d l Z d d l Z d d l Z d e j f d „  ƒ  YZ d e f d „  ƒ  YZ	 d d „ Z d S(	   s­  
M2Crypto enhancement to Python's urllib2 for handling 
'https' url's.

Code from urllib2 is Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007
Python Software Foundation; All Rights Reserved

Summary of changes:
 - Use an HTTPSProxyConnection if the request is going through a proxy.
 - Add the SSL context to the https connection when performing https_open.
 - Add the M2Crypto HTTPSHandler when building a default opener.
iÿÿÿÿN(   t   *t   _closing_fileobjectc           B   s    e  Z d  Z d „  Z d „  Z RS(   sŠ   socket._fileobject that propagates self.close() to the socket.

    Python 2.5 provides this as socket._fileobject(sock, close=True).
    c         C   s   t  j j |  | ƒ d  S(   N(   t   sockett   _fileobjectt   __init__(   t   selft   sock(    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyR      s    c         C   s'   |  j  } t j j |  ƒ | j ƒ  d  S(   N(   t   _sockR   R   t   close(   R   R   (    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyR      s    	(   t   __name__t
   __module__t   __doc__R   R   (    (    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyR      s   	t   HTTPSHandlerc           B   s&   e  Z d d  „ Z d „  Z e j Z RS(   c         C   sV   t  j |  ƒ | d  k	 rC t | t j ƒ s7 t | ƒ ‚ | |  _ n t j ƒ  |  _ d  S(   N(   t   AbstractHTTPHandlerR   t   Nonet
   isinstancet   SSLt   Contextt   AssertionErrort   ctx(   R   t   ssl_context(    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyR   %   s
    c         C   s€  | j  ƒ  } | s! t d ƒ ‚ n  | j ƒ  } t j | ƒ d } | | k r} t j | ƒ d } t j d | d |  j ƒ } n' | j ƒ  } t j	 d | d |  j ƒ } | j
 |  j ƒ t | j ƒ } | j | j ƒ d | d <y/ | j | j ƒ  | | j | ƒ | j ƒ  } Wn" t j k
 r0}	 t |	 ƒ ‚ n X| j | _ t | ƒ }
 t |
 | j | j ƒ  ƒ } | j | _ | j | _ | S(   s¦  Return an addinfourl object for the request, using http_class.

        http_class must implement the HTTPConnection API from httplib.
        The addinfourl return value is a file-like object.  It also
        has methods and attributes including:
            - info(): return a mimetools.Message object for the headers
            - geturl(): return the original request URL
            - code: HTTP status code
        s   no host giveni   i    t   hostR   R   t
   Connection(   t   get_hostt   URLErrort   get_full_urlt   urlparset	   urldefragt   httpslibt   ProxyHTTPSConnectionR   t   get_selectort   HTTPSConnectiont   set_debuglevelt   _debuglevelt   dictt   headerst   updatet   unredirected_hdrst   requestt
   get_methodt   datat   getresponseR   t   errort   readt   recvR   t
   addinfourlt   msgt   statust   codet   reason(   R   t   reqR   t   full_urlt   target_hostt   request_urit   hR#   t   rt   errt   fpt   resp(    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyt
   https_open/   s2    

N(   R	   R
   R   R   R;   R   t   do_request_t   https_request(    (    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyR   $   s   
	?c   	         sR  d d l  ‰  ‡  f d †  } t ƒ  } t t t t t t t t	 g } g  } xl | D]d } x[ | D]S } | | ƒ r t
 | | ƒ r¯ | j | ƒ q¯ q\ t | | ƒ r\ | j | ƒ q\ q\ WqO Wx | D] } | j | ƒ q¾ Wx | D] } | j | ƒ  ƒ qÜ Wt | k r| j t |  ƒ ƒ n  x3 | D]+ } | | ƒ r=| ƒ  } n  | j | ƒ qW| S(   s  Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP and FTP.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    iÿÿÿÿNc            s   t  |  ˆ  j ƒ p t |  d ƒ S(   Nt	   __bases__(   R   t	   ClassTypet   hasattr(   t   obj(   t   types(    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyt   isclass|   s    (   RB   t   OpenerDirectort   ProxyHandlert   UnknownHandlert   HTTPHandlert   HTTPDefaultErrorHandlert   HTTPRedirectHandlert
   FTPHandlert   FileHandlert   HTTPErrorProcessort
   issubclasst   appendR   t   removet   add_handlerR   (	   R   t   handlersRC   t   openert   default_classest   skipt   klasst   checkR6   (    (   RB   s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyt   build_openerr   s2    			(   R   R   t   urllib2R   R   R   R   R   R   R   R   RW   (    (    (    s8   /usr/lib64/python2.7/site-packages/M2Crypto/m2urllib2.pyt   <module>   s   
N