Ñò
ÇÜÂKc           @   s   d  Z  d d k l Z d d k l Z l Z l Z d d k l Z d d k	 l
 Z
 l Z l Z l Z l Z l Z l Z l Z d d k l Z d „  Z d „  Z e i d	 „  ƒ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d S(   s  
    werkzeug.formparser test
    ~~~~~~~~~~~~~~~~~~~~~~~~

    Tests the form parsing capabilties.  Some of them are also tested from
    the wrappers.

    :copyright: (c) 2010 by the Werkzeug Team, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
iÿÿÿÿ(   t   assert_raises(   t   joint   dirnamet   abspath(   t   StringIO(   t   Clientt   Requestt   Responset   parse_form_datat   create_environt   FileStoraget
   formparserR	   (   t   RequestEntityTooLargec          C   sŠ   t  d d d d ƒ}  |  d =|  d =t |  ƒ \ } } } | i ƒ  d j p t ‚ t | ƒ d j p t ‚ t | ƒ d j p t ‚ d	 S(
   sQ  A PUT without a Content-Type header returns empty data

    Both rfc1945 and rfc2616 (1.0 and 1.1) say "Any HTTP/[1.0/1.1] message
    containing an entity-body SHOULD include a Content-Type header field
    defining the media type of that body."  In the case where either
    headers are omitted, parse_form_data should still work.
    s   /foos   http://example.org/t   methodt   PUTt   CONTENT_TYPEt   CONTENT_LENGTHt    i    N(   R	   R   t   readt   AssertionErrort   len(   t   envt   streamt   formt   files(    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt(   test_parse_form_data_put_without_content   s    c          C   sŠ   t  d d d d ƒ}  |  d =|  d =t |  ƒ \ } } } | i ƒ  d j p t ‚ t | ƒ d j p t ‚ t | ƒ d j p t ‚ d	 S(
   sB   GET requests without data, content type and length returns no datas   /foos   http://example.org/R   t   GETR   R   R   i    N(   R	   R   R   R   R   (   R   R   R   R   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt(   test_parse_form_data_get_without_content'   s    c         C   s‚   |  i  d } | d j o t t |  i d ƒ ƒ S|  i | } t d i t | i ƒ t | i ƒ t | i ƒ | i	 i
 ƒ  f ƒ ƒ S(   Nt   objectt   texts   
(   t   argsR   t   reprR   R   R   t   filenamet   namet   content_typeR   R   (   t   requestt   result_objectt   f(    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   form_data_consumer3   s    	c         C   s/   t  |  d ƒ } z | i ƒ  SWd  | i ƒ  Xd  S(   Nt   rb(   t   fileR   t   close(   R    R%   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   get_contentsA   s    c          C   s  t  t t ƒ d ƒ }  t t t ƒ } d d d. d/ g d f d d d0 d1 g d f d d d2 d3 g d f d d d4 d5 g d f d d d6 d7 g d  f g } xh| D]`\ } } } } t  |  | ƒ } t t  | d! ƒ ƒ } xß | D]× \ }	 }
 } } | i d" |
 d# | d$ d% | d& t | ƒ ƒ} | i	 i
 d' d( ƒ } | d) t |	 ƒ j p t ‚ | d* t |
 ƒ j p t ‚ | d+ t | ƒ j p t ‚ | d( t t  | | ƒ ƒ j p t ‚ q× W| i d, d# | d$ d% | d& t | ƒ ƒ} | i	 t | ƒ j p t ‚ qš Wd- S(8   s?   Tests multipart parsing against data collected from webbrowserst	   multiparts   firefox3-2png1txts9   ---------------------------186454651713519341951581030105u
   anchor.pngt   file1s	   image/pngs	   file1.pngu   application_edit.pngt   file2s	   file2.pngu   example texts   firefox3-2pnglongtexts8   ---------------------------14904044739787191031754711748u
   accept.pngu   add.pngu,   --long text
--with boundary
--lookalikes--s   opera8-2png1txts    ----------zEO9jQKmLc2Cq88c23Dx19u   arrow_branch.pngu   award_star_bronze_1.pngu   blafasel Ã¶Ã¤Ã¼s   webkit3-2png1txts&   ----WebKitFormBoundaryjdSFhcARk8fyGNy6u   gtk-apply.pngu
   gtk-no.pngu$   this is another text with Ã¼mlÃ¤Ã¼tss   ie6-2png1txts(   ---------------------------7d91b03a20128u	   file1.pngs   image/x-pngu	   file2.pngu   ie6 sucks :-/s   request.txts	   /?object=t   dataR"   s"   multipart/form-data; boundary="%s"t   content_lengths   
i   i    i   i   s   /?object=textN(   u
   anchor.pngR,   s	   image/pngs	   file1.png(   u   application_edit.pngR-   s	   image/pngs	   file2.png(   u
   accept.pngR,   s	   image/pngs	   file1.png(   u   add.pngR-   s	   image/pngs	   file2.png(   u   arrow_branch.pngR,   s	   image/pngs	   file1.png(   u   award_star_bronze_1.pngR-   s	   image/pngs	   file2.png(   u   gtk-apply.pngR,   s	   image/pngs	   file1.png(   u
   gtk-no.pngR-   s	   image/pngs	   file2.png(   u	   file1.pngR,   s   image/x-pngs	   file1.png(   u	   file2.pngR-   s   image/x-pngs	   file2.png(   R   R   t   __file__R   R&   R   R*   t   postR   R.   t   splitR   R   (   t	   resourcest   clientt
   repositoryR!   t   boundaryR   R   t   folderR.   R    t   fieldR"   t   fsnamet   responset   lines(    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_multipartI   sP      
+
c       	   C   s¢   t  t t ƒ }  t t t ƒ d d ƒ } t | ƒ } d } |  i d d | d d | d t | ƒ ƒ} | i	 i
 d	 d
 ƒ } | d t d ƒ j p t | d ‚ d  S(   NR+   s   ie7_full_path_request.txts)   ---------------------------7da36d1b4a0164s    /?object=cb_file_upload_multipleR.   R"   s"   multipart/form-data; boundary="%s"R/   s   
i   i    u2   Sellersburg Town Council Meeting 02-22-2010doc.doc(   R   R&   R   R   R   R0   R*   R1   R   R.   R2   R   R   (   R4   t	   data_fileR.   R6   R:   R;   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_ie7_unc_pathv   s    c       	   C   s^   d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ }  |  i p t ‚ |  i p t ‚ d S(	   s,   Test for multipart files ending unexpectedlys}   --foo
Content-Disposition: form-data; name="test"; filename="test.txt"
Content-Type: text/plain

file contents and no endt   input_streamR/   R"   s!   multipart/form-data; boundary=fooR   t   POSTN(   R   t   from_valuesR   R   R   R   R   (   R.   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_end_of_file_multipart€   s    	c       
   C   s}   d }  t  t d |  d d d d ƒ ƒ \ } } } | p t ‚ | p t ‚ t t t  t d |  d d d d ƒ d t ƒd S(	   s/   Broken multipart does not break the applicaitons   --foo
Content-Disposition: form-data; name="test"; filename="test.txt"
Content-Transfer-Encoding: base64
Content-Type: text/plain

broken base 64--foo--R.   R   R@   R"   s!   multipart/form-data; boundary=foot   silentN(   R   R	   R   R    t
   ValueErrort   False(   R.   t   _R   R   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_broken_multipart’   s    	c       	   C   sy   d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ }  |  i d i d	 j p t ‚ |  i d i ƒ  d
 j p t ‚ d S(   s.   Chrome does not always provide a content type.sa   --foo
Content-Disposition: form-data; name="test"; filename="test.txt"

file contents
--foo--R?   R/   R"   s!   multipart/form-data; boundary=fooR   R@   t   tests   test.txts   file contentsN(   R   RA   R   R   R   R    R   R   (   R.   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt#   test_multipart_file_no_content_type¦   s    	c       	   C   sg   d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ }  |  i p t ‚ |  i d d	 j p t ‚ d
 S(   s.   Test for multipart uploads with extra newlinessJ   

--foo
Content-Disposition: form-data; name="foo"

a string
--foo--R?   R/   R"   s!   multipart/form-data; boundary=fooR   R@   t   foos   a stringN(   R   RA   R   R   R   R   R   (   R.   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_extra_newline_multipartµ   s    	c       	   C   s”   d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ } | i d } | i d	 j p t ‚ | i d
 d j p t ‚ | i d d j p t ‚ d S(   s    Test access to multipart headerss²   --foo
Content-Disposition: form-data; name="foo"; filename="foo.txt"
X-Custom-Header: blah
Content-Type: text/plain; charset=utf-8

file contents, just the contents
--foo--R?   R/   R"   s!   multipart/form-data; boundary=fooR   R@   RJ   s
   text/plains   content-types   text/plain; charset=utf-8s   x-custom-headert   blahN(   R   RA   R   R   R   R"   R   t   headers(   R.   t   reqRJ   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_multipart_headersÇ   s    	c          C   s’   x‹ d D]ƒ }  |  i  d ƒ } t i d t | ƒ d t | ƒ d d d d ƒ } | i GH| i d d j p t ‚ | i d d	 j p t ‚ q Wd S(   s4   Test nonstandard line endings of multipart form datas   
s   s   
s   --foos(   Content-Disposition: form-data; name=fooR   s   this is just bars(   Content-Disposition: form-data; name=bart   blafasels   --foo--R?   R/   R"   s!   multipart/form-data; boundary=fooR   R@   RJ   t   barN(   s   
s   s   
(	   s   --foos(   Content-Disposition: form-data; name=fooR   s   this is just bars   --foos(   Content-Disposition: form-data; name=barR   s   blafasels   --foo--(   R   R   RA   R   R   R   R   (   t   nlR.   RN   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_nonstandard_line_endingsÙ   s&             		c             s†  d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d ˆ  _ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d	 ˆ  _ ˆ  i d
 d j p t ‚ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d ˆ  _ t t	 ‡  f d †  ƒ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d	 ˆ  _ ˆ  i d
 d j p t ‚ d }  t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d ˆ  _ t t	 ‡  f d †  ƒ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d	 ˆ  _ ˆ  i d
 d j p t ‚ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d ˆ  _ t t	 ‡  f d †  ƒ t  i d t |  ƒ d t |  ƒ d d d d ƒ ‰  d	 ˆ  _ ˆ  i d
 d j p t ‚ d S(   s   Test the limiting featuress   foo=Hello+World&bar=bazR?   R/   R"   s!   application/x-www-form-urlencodedR   R@   i   i  RJ   s   Hello Worldi   c              s   ˆ  i  d  S(   RJ   (   R   (    (   RN   (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   <lambda>  s    s…   --foo
Content-Disposition: form-field; name=foo

Hello World
--foo
Content-Disposition: form-field; name=bar

bar=baz
--foo--s!   multipart/form-data; boundary=fooc              s   ˆ  i  d  S(   RJ   (   R   (    (   RN   (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyRT     s    c              s   ˆ  i  d  S(   RJ   (   R   (    (   RN   (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyRT   %  s    N(
   R   RA   R   R   t   max_content_lengthR   R   t   max_form_memory_sizeR    R   (   R.   (    (   RN   sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_limitingð   sb    																c          C   sZ   d d
 }  t  i d h t |  ƒ d f d 6d d ƒ } t | i d i t ƒ p t ‚ d	 S(   s   Test a largish file.t   xi   iX  R.   s   test.txtRJ   R   R@   Ni `	 (   R   RA   R   t
   isinstanceR   R   R(   R   (   R.   RN   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_large_file/  s    
"	c          C   sö  t  i d ƒ d t f j t  i d ƒ d t f j t  i d ƒ d t f j t  i d ƒ d t f j t d i t ƒ ƒ }  t  i |  ƒ } | d j p t ‚ t |  ƒ d d g j p t ‚ t  i g  ƒ d j p t ‚ t  i d g ƒ d j p t ‚ t	 t
 t  i d d d	 ƒ t	 t
 t  i d d
 d	 ƒ d } t	 t
 t  i t | ƒ d t | ƒ ƒ d } t	 t
 t  i t | ƒ d t | ƒ ƒ d } t	 t
 t  i t | ƒ d t | ƒ ƒ t  i d d g ƒ } | d d j p t ‚ t	 t
 t  i d d g ƒ d S(   s   Lowlevel formparser testsRJ   s   foo
s   foos   foo
s   


foo
bar
bazs   bar
t   bazR   i   s   broken  s   --foo

Hello World
--foo--sk   --foo
Content-Disposition: form-field; name=foo
Content-Transfer-Encoding: base64

Hello World
--foo--sA   --foo
Content-Disposition: form-field; name=foo

Hello World
s
   foo: bar
s	    x test
s   bar
 x tests    x testN(   R   t   _line_parseRE   t   Truet   itert
   splitlinest   _find_terminatorR   t   listR    RD   t   parse_multipartt   NoneR   R   t   parse_multipart_headers(   t   lineitert   lineR.   RX   (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   test_lowlevel9  s*      %%%N(#   t   __doc__t
   nose.toolsR    t   os.pathR   R   R   t	   cStringIOR   t   werkzeugR   R   R   R   R	   R
   R   t   werkzeug.exceptionsR   R   R   t   applicationR&   R*   R<   R>   RB   RG   RI   RK   RO   RS   RW   RZ   Rg   (    (    (    sC   /Users/mitsuhiko/Development/werkzeug-main/tests/test_formparser.pyt   <module>   s(   :				-	
							?	
