ó
a˜Qc        	   @   sQ  d  Z  d d l Z d d l Z e j e ƒ Z y d d l Z e j e Z	 WnA e
 k
 r d d l Z d d l Z e e d e ƒ Z	 e Z n Xy e j Z Wn e k
 r· d „  Z n Xe rå e j Z e j Z e j Z e j Z nR d e j f d „  ƒ  YZ d Z d Z d	 Z d Z d d e e e d e e d
 „ Z d e f d „  ƒ  YZ d S(   sÅ   Abstraction to simplify socket use for Python < 2.6

This will attempt to use the ssl module and the new
socket.create_connection method, but fall back to the old
methods if those are unavailable.
iÿÿÿÿNt   HTTPSHandlerc         C   sñ   |  \ } } d } d  } xº t j | | d t j ƒ D] } | \ } } } }	 }
 y9 t j | | | ƒ } t j d | | ƒ | j |
 ƒ WnE t j k
 rÏ } t j d | | ƒ | rÃ | j ƒ  n  d  } q4 n XPq4 W| sí t j | ƒ ‚ n  | S(   Ns!   getaddrinfo returns an empty listi    s   connect: (%s, %s)s   connect fail: %s %s(	   t   Nonet   sockett   getaddrinfot   SOCK_STREAMt   loggert   infot   connectt   errort   close(   t   addresst   hostt   portt   msgt   sockt   rest   aft   socktypet   protot
   _canonnamet   sa(    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyt   create_connection6   s(    t
   FakeSocketc           B   s   e  Z d  Z d d d „ Z RS(   s*   Socket wrapper that supports SSL.
        i   i    c         C   s‚   | d k r" t  d |  j ƒ ‚ n  xY t r} y |  j j | ƒ SWq% t j k
 ry } | j d t j k rp q% qz | ‚ q% Xq% Wd S(   s1   ssl-aware wrapper around socket.recv
            i    s3   non-zero flags not allowed in calls to recv() on %sN(	   t
   ValueErrort	   __class__t   Truet   _sslt   readR   t   sslerrort   argst   SSL_ERROR_WANT_READ(   t   selft   buflent   flagst   x(    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyt   recvX   s    	(   t   __name__t
   __module__t   __doc__R#   (    (    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyR   R   s   i   i    i   c	   
      C   sC   | t  k r! | r! t d ƒ ‚ n  t j |  ƒ }	 t |  |	 ƒ }  |  S(   NsU   SSL certificate validation requires the ssl module(included in Python 2.6 and later.)(   t	   CERT_NONEt    CertificateValidationUnsupportedR   t   sslR   (
   R   t   keyfilet   certfilet   server_sidet	   cert_reqst   ssl_versiont   ca_certst   do_handshake_on_connectt   suppress_ragged_eofst   sslob(    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyt   wrap_socketn   s    R(   c           B   s   e  Z d  Z RS(   sC   Exception raised when cert validation is requested but unavailable.(   R$   R%   R&   (    (    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyR(   }   s   (   R&   t   loggingR   t	   getLoggerR$   R   R)   R3   R   t   have_sslt   ImportErrort   httplibt   urllib2t   getattrt   FalseR   t   AttributeErrorR'   t   CERT_OPTIONALt   CERT_REQUIREDR   t   _PROTOCOL_SSLv23R   t	   ExceptionR(   (    (    (    sC   /sys/lib/python2.7/site-packages/mercurial/httpclient/socketutil.pyt   <module>"   s@   

			