wceel>ddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZddlmZmZmZmZmZmZmZmZddlmZmZddlmZmZdd lmZdd l m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l m-Z-m.Z.m/Z/dd lm0Z0ddl1m2Z2m3Z3dZ4erddl5m6Z6ee7efZ8nej<j(Z8GddejrZ:Gdde8e&Z;Gdde;Zde?dee7dee3d e7d!e2d"eZ2d?e3ddfd@Z4dOdAZ5dRd?e3ddfdBZ6defdCZ7dDede8fdEZ9dDede8ddfdFZ:dDeddfdGZ;defdHZdefdJZ?dKe@de fdLZAxZBS)Sr&TNstatusreasonheadersr7r8r9returnc$d|_d|_d|_d|_d|_t |_d|_d|_d|_ d|_ d|_ i|_ |t||_nt|_|j||y)NFr)_body _keep_alive_chunked _compression_compression_forcer_cookies_req_payload_writer _eof_sent_must_be_empty_body _body_length_stater_headers set_status)selfr7r8r9s r3__init__zStreamResponse.__init__Js +/ !;?$ +/ ?C37 &(  .9'.BDM'MDM 'r2c|jduSN)rCrJs r3preparedzStreamResponse.preparedfs##4//r2cH|jr|jjSyrM)rBtaskrNs r3rQzStreamResponse.taskjs 9999>> !r2c|jSrM)_statusrNs r3r7zStreamResponse.statusq ||r2c|jSrM)r>rNs r3chunkedzStreamResponse.chunkedu }}r2c|jSrM)r?rNs r3 compressionzStreamResponse.compressiony   r2c|jSrM)_reasonrNs r3r8zStreamResponse.reason}rTr2c|jrJdt||_|( t|jj}||_y||_y#t $r d}Y||_ywxYw)NzGCannot change the response status code after the headers have been sent)rOintrSrphrase ValueErrorr\)rJr7r8s r3rIzStreamResponse.set_statussr == X  6{ > #DLL188 v    sA A+*A+c|jSrMr=rNs r3 keep_alivezStreamResponse.keep_alivesr2cd|_y)NFrcrNs r3 force_closezStreamResponse.force_closes  r2c|jSrM)rFrNs r3 body_lengthzStreamResponse.body_lengthrZr2c~tjdt|jsJ|jjS)Nzoutput_length is deprecated)warningswarnDeprecationWarningrC buffer_sizerNs r3 output_lengthzStreamResponse.output_lengths3 35GH######///r2 chunk_sizecd|_tj|jvr t d|t j dtyy)z,Enables automatic chunked transfer encoding.Tz>You can't enable chunked encoding when a content length is setNzChunk size is deprecated #1615)r>rCONTENT_LENGTHrH RuntimeErrorrjrkrl)rJros r3enable_chunked_encodingz&StreamResponse.enable_chunked_encodingsH   $-- /S   ! MM:rrrrHrrqrrJrs r3rzStreamResponse.content_lengths\  JE}}"U25UDMM$-- . MM  d114 8r2ct|SrM)r content_typers r3rzStreamResponse.content_typesw##r2c\|jt||_|jyrM)rr _content_type_generate_content_type_headerrs r3rzStreamResponse.content_type"s#  Z **,r2ct|SrM)rcharsetrs r3rzStreamResponse.charset(swr2c|j}|dk(r td|jJ||jjddn&t |j |jd<|j y)Napplication/octet-streamzYSetting charset for application/octet-stream doesn't make sense, setup content_type firstr)rrr _content_dictrrlowerr)rJrctypes r3rzStreamResponse.charset-s!! . .? !!--- =    " "9d 3,/J,<,<,>D  y ) **,r2cft|jjtjS)zuThe value of Last-Modified HTTP header, or None. This header is represented as a `datetime` object. )rrHrr LAST_MODIFIEDrNs r3 last_modifiedzStreamResponse.last_modified<s$ t}}001C1CDEEr2cJ|+|jjtjdyt |t t frXtjdtjtj||jtj<yt |tjr@tjd|j|jtj<yt |tr||jtj<yy)Nz%a, %d %b %Y %H:%M:%S GMT)rHrrrrxr_floattimestrftimegmtimemathceildatetime utctimetuplerrs r3rzStreamResponse.last_modifiedDs = MM  d00$ 7 U| ,04 +T[[59I-J1DMM$,, -x00 104 +U-?-?-A1DMM$,, -s #05DMM$,, -$r2c|jjtj}|sy|tk(rt tSt j|}|sy|jdd\}}t t||S)N)rr)is_weakr) rHrrETAGrrr fullmatchgrouprw)rJ quoted_valuematchrrs r3etagzStreamResponse.etagUst}}((3  X %h' '((6Q*M  r2c|+|jjtjdyt |t r |t k(s#t |tr5|jt k(r"t |jtj<yt |t r-t|d|d|jtj<yt |tryt |jt r_t|j|jrd|jdnd|jd}||jtj<ytdt|d)N"zW/"zUnsupported etag type: z . etag must be str, ETag or None) rHrrrrxrrrrrrrarv)rJr hdr_values r3rzStreamResponse.etages = MM  dii .$(): ud # x(?'/DMM$)) $ s #  &)*5'|DMM$)) $ t $EKK)E  ,05 #ekk]!,Qu{{mSTCUI'0DMM$)) $)$u+712 r2 CONTENT_TYPEc|jJ|jJdjd|jjD}|r|jdz|z}n |j}||j|<y)Nz; c30K|]\}}|d|yw)=Nr1).0kvs r3 z?StreamResponse._generate_content_type_header..sM$!QaS!:Ms)rrjoinitemsrH)rJrparamsrs r3rz,StreamResponse._generate_content_type_headerzs|!!---!!---M$2D2D2J2J2LMM &&-6E&&E&+ l#r2codingc<K|tjk7r|jJ|j|jt j <|jj|j|jjt jdyywrM) r%r-rCrrHrCONTENT_ENCODINGrypopallrq)rJrs r3_do_start_compressionz$StreamResponse._do_start_compressionsw ]++ +''3 3339<>    +'' '#5gnndkk#R [[))))sAA(!A&"A(cK||_|jx}|_|jd{|j|d{|j d{|S777 7 wrM)rBrC_prepare_headers _prepare_hook_write_headers)rJrwriters r3rzStreamResponse._startsj (/(?(??%##%%%##D)))!!### &)#s3.A.A(A. A* A.!A,"A.*A.,A.c K|j}|J|j}|J|j}| |j}||_|j}|j }|j jD]7}|jddd}|jtj|9|jr|j|d{|jr|tk7r$t!dj#|j|j$s#|j'd|tj(<tj*|vr|tj*=np|j,rd|j.|_|j0G|tk\r0|j$s2|j'd|tj(<n|j$sd}|j$rgtj*|vr1t3|j4|j6r|tj*=tj(|vr2|tj(=n |j9tj:d|j9tj<t?|j9tj@tBtjD|vr>|r|tFk(rd|tjD<yy|tk(rd |tjD<yyy71w) Nr^)headerrz@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rVFrz keep-aliveclose)$rBrCr=rdrrHrAvaluesoutputaddr SET_COOKIEr?rr>r!rrformatrEenable_chunkingTRANSFER_ENCODINGrq _length_checkrlengthrrr7 setdefaultrDATErSERVERr CONNECTIONr )rJrrrdrr9cookiers r3rzStreamResponse._prepare_headerss))"""%%!!!%%   ++J%//--mm**, 0FMMM,QR0E KK / 0   ))'2 2 2 ==-'"3396'//3J++&&(2;../""g-D//0    //FM}}$m+33..0:C 6 6711!&J  # #""g-2N 3D//0%%0D223   t002L M499&;&=>4;;8 ??' )m+/;GDOO,,m+/6GDOO,, *Q 3sCLLH1Lc K|j}|J|j}|J|j}dj|d|d|j|j }|j ||jd{y7w)NzHTTP/{}.{} {} {}rr)rBrCrrrSr\ write_headersrH)rJrrr status_lines r3rzStreamResponse._write_headerss))"""%%!!!//(// AJ DLL$,, ""; >>>sA:B<B=BdatacKt|tttfsJdt |z|j r t d|j t d|jj|d{y7w)N#data argument must be byte-ish (%r)z%Cannot call write() after write_eof()z$Cannot call write() before prepare()) rxbytes bytearray memoryviewrvrDrrrCwriterJrs r3rzStreamResponse.writes| 5)Z0  > 04: = >  >>FG G    'EF F""((...sA;B=B>BcK|jrJd|jJdtjdtd|jj d{y7w)NzEOF has already been sentResponse has not been startedz2drain method is deprecated, use await resp.write()r) stacklevel)rDrCrjrkrldrainrNs r3rzStreamResponse.drains`>>>#>>!##/P1PP/ @  ""((***sA A*"A(#A*cRKt|tttfsJdt |z|j ry|j Jd|j j|d{d|_d|_|j j|_ d|_y75w)NrrT) rxrrrrvrDrC write_eofrB output_sizerFrs r3rzStreamResponse.write_eofs 5)Z0  > 04: = >  >> ##/P1PP/"",,T222  00<<# 3sA-B'/B%06B'c|jrd}nM|jr?|jJ|jjd|jjd}nd}d|j j d|jd|dS)Neof z not prepared<>)rDrOrBrrrr.r8)rJinfos r3__repr__zStreamResponse.__repr__sz >>D ]]99( ((ii&&'q(8:D!D4>>**+1T[[M4&BBr2keyc |j|SrMrGrJrs r3 __getitem__zStreamResponse.__getitem__)s{{3r2c"||j|<yrMr)rJrrs r3 __setitem__zStreamResponse.__setitem__,s  Cr2c|j|=yrMrr s r3 __delitem__zStreamResponse.__delitem__/s KK r2c,t|jSrM)lenrGrNs r3__len__zStreamResponse.__len__2s4;;r2c,t|jSrM)iterrGrNs r3__iter__zStreamResponse.__iter__5sDKK  r2c*tt|SrM)hashidrNs r3__hash__zStreamResponse.__hash__8sBtH~r2otherc ||uSrMr1)rJrs r3__eq__zStreamResponse.__eq__;s u}r2)r:zOptional[asyncio.Task[None]]rM)r:N)r:zCIMultiDict[str])rr)r:Nr2)Cr.r/r0rr_r rr$rKpropertyrwrOrQr7rVrYr8rIrdrfrhrnrsr r%ryr9rr|rrrsetterrrrrrrrrrrrrrrrrrrrrrrrrr r rrr rrobjectr __classcell__rs@r3r&r&FswM  $*. (( ( ,' (  (80$00 !T!! !%     HTN  !!S!!0s00 P(3- P4 P=A(eD-$789( ($"& $-1!%#'!%"&1%1%1% # 1%  1%%S/*1%1%1%4.1%#1%3-1% 1%h59c  $,SM @C  $& && 9HSM 9d 9 9$c$$-#-$-- # ^^ -Xc] -t - -Fx(9(9:FF6eC0A0A3$FGH6 66   htn     [[(5s#34*$(#4#4 ,  ,  ,<-2MPW2W T../{{7+  L0+w/B$'  +*$ w(>> 6BL!2!23 v|L  DIDI15#5 +r2c|jSrM)r<rNs r3r#z Response.bodys zzr2c8|d|_d|_d|_yt|ttfr||_d|_d|_y t j j|x|_}d|_|j}tj|vr|j|tj<|jr,|jj!D]\}}||vs |||<d|_y#t j$rtdt|zwxYw)NFzUnsupported body type %rT)r< _body_payloadrxrrrPAYLOAD_REGISTRYr LookupErrorrarvrHrrrr9rr-)rJr#r9rrs r3r#z Response.bodys <*.DJ',D 0!%/ui0 1DJ!&D *!%' J$+$<$<$@$@$FF T"&D mmG  /-1->->))*||$(LL$6$6$8-LS%')', -!%#&& J !;d4j!HII Js &C..+Dcn|jy|jj|jxsdS)Nr*)r<decoderrNs r3r$z Response.texts- :: zz  !899r2c|#t|tsJdt|z|jdk(rd|_|jd|_|j |j|_d|_d|_y)Nr(rr)r*F) rxrrvrrr,r<r3r-)rJr$s r3r$z Response.texts||z #  9 +d4j 8 9     : : ,D  << "DL[[. " $r2c |jrytj|jvr t|S|j t|j S|jry|jt|jSy)Nr) r>rrqrHrrr-rr3r<rs r3rzResponse.content_lengthsn ==   $-- /7) )  ,t,,- -    ZZ #tzz? "r2rctd)Nz#Content length is set automatically)rrrs r3rzResponse.content_lengths@AAr2rcFK|jry|j |j}n |j}|r Jd||jJ|jJ||j rt |d{y|jrKtt|}|j|jd{t |d{yt |tt|d{yt |d{y77Z7F7"7 w)Nzdata arg is not supported, got ) rDr-r<rBrCrErrr3r r"rr)rJrr#rrs r3rzResponse.write_eofs  >>   (48JJD((DC:4(CCxyy$$$##///  ''g')))##w-#gmmD$8$8999g')))g'UD(9:::'#% % %*:): %s[A:D!=D>AD!>D?D!D%D!:D;D!DD!D!D!D!D!rr)cKt|j|jr:tj|j vr&|j tj=n |j stj|j vr|jrMtt|jj}|t||j tj<n|jrt|jnd}|dk7s:|jdk7rQ|jjtjk7r&t||j tj<t |E|d{S7w)N0i0)rrr7rrqrHr>r3r r"r<sizerrupper METH_HEADrr)rJrr>body_lenrs r3rzResponse._starts ' D""dmm3MM$"5"564#6#6dmm#K!!GTZZ055#9>+?+?+AT^^+S9:FrcK|js |jrt| |d{S|tj k7r;t t|j|j|j}|jJ|jDt|jdkDr,tjdt|jd|j|jd{|j!z|_|j"J|j|j$t&j(<tt|j"|j$t&j*<yy7U7w)N)encodingmax_sync_chunk_sizeexecutoriz2Synchronous compression of large response bodies (z bytes) might block the async event loop. Consider providing a custom value to zlib_executor_size/zlib_executor response properties or disabling compression on it.)r3r>rrr%r-rrrr.r/r<rrjrkcompressflushr-rHrrrq)rJr compressorrs r3rzResponse._do_start_compressionsF   6v>> > ]++ +(V\\*$($<$<,,J ::) ))''/C Ok4Q DJJ()XX!))$**55 8H8H8JJ  !((4 4439<r]sP '%   (%-   @?/ J(sCx(I..IDIIvY vrXQ~XQx  &**  3- 5/    SM l # r2