ó
ýGpNc           @   s£   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d
 d „  ƒ  YZ d Z d e j	 f d „  ƒ  YZ
 d „  Z e d	 k rŸ e ƒ  n  d S(   sù  
Usage:
  Enables the use of multipart/form-data for posting forms

Inspirations:
  Upload files in python:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
  urllib2_file:
    Fabien Seisen: <fabien@seisen.org>

Example:
  import MultipartPostHandler, urllib2, cookielib

  cookies = cookielib.CookieJar()
  opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
                                MultipartPostHandler.MultipartPostHandler)
  params = { "username" : "bob", "password" : "riviera",
             "file" : open("filename", "rb") }
  opener.open("http://wwww.bobsite.com/upload/", params)

Further Example:
  The main function of this file is a sample which downloads a page and
  then uploads it to the W3C validator.
iÿÿÿÿNt   Callablec           B   s   e  Z d  „  Z RS(   c         C   s   | |  _  d  S(   N(   t   __call__(   t   selft   anycallable(    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyt   __init__/   s    (   t   __name__t
   __module__R   (    (    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyR    .   s   i   t   MultipartPostHandlerc           B   sB   e  Z e j j d  Z d „  Z d d d „ Z e e ƒ Z e Z	 RS(   i
   c         C   s…  | j  ƒ  } | d  k	 rt | ƒ t k rg  } g  } y\ xU | j ƒ  D]G \ } } t | ƒ t k rz | j | | f ƒ qF | j | | f ƒ qF WWn; t k
 rÏ t j	 ƒ  \ } } } t d ƒ j
 | ƒ ‚ n Xt | ƒ d k r÷ t j | t ƒ } nz |  j | | ƒ \ }	 } d |	 }
 | j d ƒ ra| j d ƒ j d ƒ d k rad | j d ƒ d f GHn  | j d |
 ƒ | j | ƒ n  | S(   Ns1   not a valid non-string sequence or mapping objecti    s    multipart/form-data; boundary=%ss   Content-Types   multipart/form-datas   Replacing %s with %ss   content-type(   t   get_datat   Nonet   typet   strt   itemst   filet   appendt	   TypeErrort   syst   exc_infot   with_tracebackt   lent   urllibt	   urlencodet   doseqt   multipart_encodet
   has_headert
   get_headert   findt   add_unredirected_headert   add_data(   R   t   requestt   datat   v_filest   v_varst   keyt   valuet   systypet	   tracebackt   boundaryt   contenttype(    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyt   http_request9   s,    
c   
      C   sD  | d  k r t j ƒ  } n  | d  k r0 d } n  xB |  D]: \ } } | d | 7} | d | 7} | d | d 7} q7 Wx´ | D]¬ \ } } t j | j ƒ  ƒ t j } | j j	 d ƒ d } t
 j | ƒ d pÐ d	 }	 | d | 7} | d
 | | f 7} | d |	 7} | j d ƒ | d | j ƒ  d 7} q| W| d | 7} | | f S(   Nt    s   --%s
s)   Content-Disposition: form-data; name="%s"s   

s   
t   /iÿÿÿÿi    s   application/octet-streams:   Content-Disposition: form-data; name="%s"; filename="%s"
s   Content-Type: %s
s
   --%s--

(   R	   t	   mimetoolst   choose_boundaryt   ost   fstatt   filenot   statt   ST_SIZEt   namet   splitt	   mimetypest
   guess_typet   seekt   read(
   t   varst   filesR%   t   bufferR!   R"   t   fdt	   file_sizet   filenameR&   (    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyR   U   s&    	N(
   R   R   t   urllib2t   HTTPHandlert   handler_orderR'   R	   R   R    t   https_request(    (    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyR   6   s
   	c             sŽ   d d  l  ‰  d d  l }  d ‰ t j t ƒ ‰ ‡  ‡ ‡ f d †  } t |  j d ƒ d k r€ x, |  j d D] } | | ƒ qi Wn
 | d ƒ d  S(   Niÿÿÿÿs   http://validator.w3.org/checkc            s‰   ˆ  j  d d ƒ } t j | d ˆ j |  ƒ j ƒ  ƒ i d d 6d d 6t | d d	 ƒ d
 6} ˆ j ˆ | ƒ j ƒ  GHt j | d ƒ d  S(   Nt   suffixs   .htmli    t   0t   sst   Inlinet   doctypei   t   rbt   uploaded_file(   t   mkstempR,   t   writet   openR6   t   remove(   t   urlt   tempt   params(   t   tempfilet   openert   validatorURL(    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyt   validateFilet   s    #
i   i    s   http://www.google.com(   RO   R   R=   t   build_openerR   R   t   argv(   R   RR   t   arg(    (   RO   RQ   RP   sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyt   mainn   s    	t   __main__(    (   t   __doc__R   R=   R*   R3   R,   R/   R    R   t   BaseHandlerR   RV   R   (    (    (    sM   /usr/lib/python2.7/dist-packages/apport/crashdb_impl/multipartpost_handler.pyt   <module>'   s   8	