tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
X\¬Qc@sFdZdgZddlZddlZddlmZmZmZmZddl    Z    ej
dƒZ ej
dƒZ de fd„ƒYZd    „Zd
„Zd dd „ƒYZd dd„ƒYZddd„ƒYZdd d„ƒYZdd!d„ƒYZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZdS("s"
Middleware to check for obedience to the WSGI specification.
 
Some of the things this checks:
 
* Signature of the application and start_response (including that
  keyword arguments are not used).
 
* Environment checks:
 
  - Environment is a dictionary (and not a subclass).
 
  - That all the required keys are in the environment: REQUEST_METHOD,
    SERVER_NAME, SERVER_PORT, wsgi.version, wsgi.input, wsgi.errors,
    wsgi.multithread, wsgi.multiprocess, wsgi.run_once
 
  - That HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH are not in the
    environment (these headers should appear as CONTENT_LENGTH and
    CONTENT_TYPE).
 
  - Warns if QUERY_STRING is missing, as the cgi module acts
    unpredictably in that case.
 
  - That CGI-style variables (that don't contain a .) have
    (non-unicode) string values
 
  - That wsgi.version is a tuple
 
  - That wsgi.url_scheme is 'http' or 'https' (@@: is this too
    restrictive?)
 
  - Warns if the REQUEST_METHOD is not known (@@: probably too
    restrictive).
 
  - That SCRIPT_NAME and PATH_INFO are empty or start with /
 
  - That at least one of SCRIPT_NAME or PATH_INFO are set.
 
  - That CONTENT_LENGTH is a positive integer.
 
  - That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should
    be '/').
 
  - That wsgi.input has the methods read, readline, readlines, and
    __iter__
 
  - That wsgi.errors has the methods flush, write, writelines
 
* The status is a string, contains a space, starts with an integer,
  and that integer is in range (> 100).
 
* That the headers is a list (not a subclass, not another kind of
  sequence).
 
* That the items of the headers are tuples of strings.
 
* That there is no 'status' header (that is used in CGI, but not in
  WSGI).
 
* That the headers don't contain newlines or colons, end in _ or -, or
  contain characters codes below 037.
 
* That Content-Type is given if there is content (CGI often has a
  default content type, but WSGI does not).
 
* That no Content-Type is given when there is no content (@@: is this
  too restrictive?)
 
* That the exc_info argument to start_response is a tuple or None.
 
* That all calls to the writer are with strings, and no other methods
  on the writer are accessed.
 
* That wsgi.input is used properly:
 
  - .read() is called with zero or one argument
 
  - That it returns a string
 
  - That readline, readlines, and __iter__ return strings
 
  - That .close() is not called
 
  - No other methods are provided
 
* That wsgi.errors is used properly:
 
  - .write() and .writelines() is called with a string
 
  - That .close() is not called, and no other methods are provided.
 
* The response iterator:
 
  - That it is not a string (it should be a list of a single string; a
    string will work, but perform horribly).
 
  - That .next() returns a string
 
  - That the iterator is not iterated over until start_response has
    been called (that can signal either a server or application
    error).
 
  - That .close() is called (doesn't raise exception, only prints to
    sys.stderr, because we only know it isn't called when the object
    is garbage collected).
t    validatoriÿÿÿÿN(tDictTypet
StringTypet    TupleTypetListTypes^[a-zA-Z][a-zA-Z0-9\-_]*$s [\000-\037]t WSGIWarningcBseZdZRS(s:
    Raised in response to WSGI-spec-related warnings
    (t__name__t
__module__t__doc__(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRzscGs|st|Œ‚ndS(N(tAssertionError(tcondtargs((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pytassert_scs‡fd†}|S(s®
    When applied between a WSGI server and a WSGI application, this
    middleware will check for WSGI compliancy on a number of levels.
    This middleware does not modify the request or response in any
    way, but will raise an AssertionError if anything seems off
    (except for a failure to close the application iterator, which
    will be printed to stderr -- there's no way to raise an exception
    at that point).
    csÂtt|ƒdkdƒt| dƒ|\}‰t|ƒg‰‡‡fd†}t|dƒ|d<t|dƒ|d<ˆ||ƒ}t|dk    o¤|tkdƒt|ƒt|ˆƒS(NisTwo arguments requiredsNo keyword arguments allowedcsÁtt|ƒdkp$t|ƒdkd|fƒt| dƒ|d}|d}t|ƒdkrs|d}nd}t|ƒt|ƒt||ƒt|ƒˆjdƒtˆ|ŒƒS(NiisInvalid number of arguments: %ssNo keyword arguments allowedii(    R tlentNonet check_statust check_headerstcheck_content_typetcheck_exc_infotappendt WriteWrapper(R tkwtstatustheaderstexc_info(tstart_responsetstart_response_started(sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pytstart_response_wrapperšs$
 
 
 
 
 s
wsgi.inputs wsgi.errorss>The application must return an iterator, if only an empty list(    R R t check_environt InputWrappert ErrorWrapperRtFalsetcheck_iteratortIteratorWrapper(R RtenvironRtiterator(t application(RRsX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pytlint_apps 
 
((R$R%((R$sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRƒs )RcBs>eZd„Zd„Zd„Zd„Zd„Zd„ZRS(cCs ||_dS(N(tinput(tselft
wsgi_input((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt__init__¼scGsHtt|ƒdkƒ|jj|Œ}tt|ƒtdƒkƒ|S(Nit(R R R&treadttype(R'R tv((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR+¿scCs/|jjƒ}tt|ƒtdƒkƒ|S(NR*(R&treadlineR R,(R'R-((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR.ÅscGsutt|ƒdkƒ|jj|Œ}tt|ƒtgƒkƒx*|D]"}tt|ƒtdƒkƒqKW|S(NiR*(R R R&t    readlinesR,(R'R tlinestline((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR/Ês   ccs%x|jƒ}|sdS|VqdS(N(R.(R'R1((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt__iter__Òs
 cCstddƒdS(Nis input.close() must not be called(R (R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pytcloseÙs(RRR)R+R.R/R2R3(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRºs                     RcBs5eZd„Zd„Zd„Zd„Zd„ZRS(cCs ||_dS(N(terrors(R't wsgi_errors((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR)ÞscCs0tt|ƒtdƒkƒ|jj|ƒdS(NR*(R R,R4twrite(R'ts((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR6áscCs|jjƒdS(N(R4tflush(R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR8åscCs"x|D]}|j|ƒqWdS(N(R6(R'tseqR1((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt
writelinesès cCstddƒdS(Nis!errors.close() must not be called(R (R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR3ìs(RRR)R6R8R:R3(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRÜs
                RcBseZd„Zd„ZRS(cCs ||_dS(N(twriter(R't wsgi_writer((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR)ñscCs-tt|ƒtdƒkƒ|j|ƒdS(NR*(R R,R;(R'R7((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt__call__ôs(RRR)R=(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRïs    tPartialIteratorWrappercBseZd„Zd„ZRS(cCs ||_dS(N(R#(R't wsgi_iterator((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR)úscCst|jdƒS(N(R!R#R(R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR2ýs(RRR)R2(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR>øs    R!cBs5eZd„Zd„Zd„Zd„Zd„ZRS(cCs.||_t|ƒ|_t|_||_dS(N(toriginal_iteratortiterR#Rtclosedtcheck_start_response(R'R?RC((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR)s        cCs|S(N((R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR2    scCsOt|j dƒ|jjƒ}|jdk    rKt|jdƒd|_n|S(NsIterator read after closedsjThe application returns and we started iterating over its body, but start_response has not yet been called(R RBR#tnextRCR(R'R-((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRD s
     cCs/t|_t|jdƒr+|jjƒndS(NR3(tTrueRBthasattrR@R3(R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR3s    cCs0|jstjjdƒnt|jdƒdS(Ns/Iterator garbage collected without being closed(RBtsyststderrR6R (R'((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt__del__s
        
    (RRR)R2RDR3RI(((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR!s
            
   c    Cs•tt|ƒtkdt|ƒ|fƒxCdddddddd    d
g    D] }t||kd |fƒqKWx5d d gD]'}t||kd||dfƒq|Wd|krÆtjdtƒnx^|jƒD]P}d|krëqÓntt||ƒtkd|t||ƒ||fƒqÓWtt|dƒtkd|dfƒt|dd+kd|dƒt    |dƒt
|dƒ|dd,krµtjd |dtƒnt|j d!ƒ pØ|d!j d"ƒd#|d!ƒt|j d$ƒ p
|d$j d"ƒd%|d$ƒ|j d&ƒrPtt |d&ƒd'kd(|d&ƒn|j d!ƒsutd$|kd)ƒnt|j d!ƒd"kd*ƒdS(-Ns:Environment is not of the right type: %r (environment: %r)tREQUEST_METHODt SERVER_NAMEt SERVER_PORTs wsgi.versions
wsgi.inputs wsgi.errorsswsgi.multithreadswsgi.multiprocesss wsgi.run_onces$Environment missing required key: %rtHTTP_CONTENT_TYPEtHTTP_CONTENT_LENGTHs8Environment should not have the key: %s (use %s instead)it QUERY_STRINGs’QUERY_STRING is not in the WSGI environment; the cgi module will use sys.argv when this variable is missing, so application errors are more likelyt.s9Environmental variable %s is not a string: %r (value: %r)s#wsgi.version should be a tuple (%r)swsgi.url_schemethttpthttpsswsgi.url_scheme unknown: %rtGETtHEADtPOSTtOPTIONStPUTtDELETEtTRACEsUnknown REQUEST_METHOD: %rt SCRIPT_NAMEt/s$SCRIPT_NAME doesn't start with /: %rt    PATH_INFOs"PATH_INFO doesn't start with /: %rtCONTENT_LENGTHisInvalid CONTENT_LENGTH: %rsgOne of SCRIPT_NAME or PATH_INFO are required (PATH_INFO should at least be '/' if SCRIPT_NAME is empty)sOSCRIPT_NAME cannot be '/'; it should instead be '', and PATH_INFO should be '/'(RQRR(RSRTRURVRWRXRY(R R,RtwarningstwarnRtkeysRRt check_inputt check_errorstgett
startswithtint(R"tkey((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR"s`         
 #     
 
cCsAx:ddddgD]&}tt||ƒd||fƒqWdS(NR+R.R/R2s-wsgi.input (%r) doesn't have the attribute %s(R RF(R(tattr((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRacscCs>x7dddgD]&}tt||ƒd||fƒqWdS(NR8R6R:s.wsgi.errors (%r) doesn't have the attribute %s(R RF(R5Rg((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRbiscCs°tt|ƒtkd|ƒ|jddƒd}tt|ƒdkd|ƒt|ƒ}t|dkd|ƒt|ƒdks•|dd    kr¬tjd
|t    ƒndS( Ns Status must be a string (not %r)iiis)Status codes must be three characters: %ridsStatus code is invalid: %rit sjThe status string (%r) should be a three-digit integer followed by a single space and a status explanation(
R R,RtsplitRR ReR^R_R(Rt status_codet
status_int((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyRos   "c    Cs_tt|ƒtkd|t|ƒfƒi}x)|D]!}tt|ƒtkd|t|ƒfƒtt|ƒdkƒ|\}}t|jƒdkd|ƒd||jƒ<td|koÌd|kd|ƒttj|ƒd    |ƒt|j    d
ƒ o|j    d ƒ d |ƒt
j|ƒr6td d|t
j|ƒj d ƒfƒq6q6WdS(Ns%Headers (%r) must be of type list: %rs1Individual headers (%r) must be of type tuple: %riRsyThe Status header cannot be used; it conflicts with CGI script, and HTTP status is not given through headers (value: %r).s
t:s,Header names may not contain ':' or '\n': %rsBad header name: %rt-t_s#Names may not end in '-' or '_': %ris#Bad header value: %r (bad char: %r)( R R,RRR tlowerRt    header_retsearchtendswithtbad_header_value_retgroup(Rt header_namestitemtnametvalue((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR~s,         cCs“t|jddƒdƒ}d}xJ|D]B\}}|jƒdkr)||krWdStdd|ƒq)q)W||krtdd|ƒndS(    NiiiÌi0s content-typesJContent-Type header found in a %s response, which must not return content.s,No Content-Type header found in headers (%s)(iÌi0(ReRiRRoR (RRtcodetNO_MESSAGE_BODYRwRx((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR—s      cCs?t|dkp$t|ƒtdƒkd|t|ƒfƒdS(Ns exc_info (%r) is not a tuple: %r((R RR,(R((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR¥s$cCstt|tƒ dƒdS(NsvYou should not return a string as your application iterator, instead return a single-item list containing that string.(R t
isinstancetstr(R#((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyR ªs((((((Rt__all__treRGttypesRRRRR^tcompileRpRstWarningRR RRRRR>R!RRaRbRRRRR (((sX/tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/wsgiref/validate.pyt<module>ns.      "         7"        !    A