
    8P[iN"                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZmZ ddlmZ ddlmZmZmZmZmZ  G d d	      Z G d
 d      Z G d d      ZdedefdZy)zkAGSI Brotli middleware build on top of starlette.

Code is based on GZipMiddleware shipped with starlette.
    N)NoReturn)	MODE_FONTMODE_GENERIC	MODE_TEXT
Compressor)HeadersMutableHeaders)GZipResponder)ASGIAppMessageReceiveScopeSendc                       e Zd ZdZeZeZeZ	y)ModezBrotli available modes.N)
__name__
__module____qualname____doc__r   genericr   textr   font     f/var/www/html/chatbot/Makanify-Chatbot-2/venv/lib/python3.12/site-packages/gradio/brotli_middleware.pyr   r      s    !GDDr   r   c                       e Zd ZdZ	 	 	 	 	 	 	 ddedededededed	ed
ee   dz  ddfdZ	de
dededdfdZde
defdZde
defdZy)BrotliMiddlewarez#Brotli middleware public interface.Nappqualitymodelgwinlgblockminimum_sizegzip_fallbackexcluded_handlersreturnc	                     || _         || _        t        t        |      | _        || _        || _        || _        || _        |r)|D 	cg c]  }	t        j                  |	       c}	| _        yg | _        yc c}	w )ao  
        Arguments.

        mode: The compression mode can be:
            generic, text (*default*. Used for UTF-8 format text input)
            or font (for WOFF 2.0).
        quality: Controls the compression-speed vs compression-
            density tradeoff. The higher the quality, the slower the compression.
            Range is 0 to 11.
        lgwin: Base 2 logarithm of the sliding window size. Range
            is 10 to 24.
        lgblock: Base 2 logarithm of the maximum input block size.
            Range is 16 to 24. If set to 0, the value will be set based on the
            quality.
        minimum_size: Only compress responses that are bigger than this value in bytes.
        gzip_fallback: If True, uses gzip encoding if br is not in the Accept-Encoding header.
        excluded_handlers: List of handlers to be excluded from being compressed.
        N)r   r   getattrr   r    r#   r!   r"   r$   recompiler%   )
selfr   r   r    r!   r"   r#   r$   r%   paths
             r   __init__zBrotliMiddleware.__init__   sk    : D$'	(
*CT%U4bjj&6%UD"%'D" &Vs   A3scopereceivesendc                   K   | j                  |      s|d   dk7  s| j                  |      s| j                  |||       d {   S t        |      }d|j	                  dd      v r_t        | j                  | j                  | j                  | j                  | j                  | j                        } ||||       d {    y | j                  rGd|j	                  dd      v r3t        | j                  | j                        } ||||       d {    y | j                  |||       d {    y 7 7 v7 %7 w)Ntypehttp)r.   brAccept-Encoding gzip)_is_handler_excluded_is_compressible_file_typer   r   getBrotliResponderr   r    r!   r"   r#   r$   r
   )r+   r.   r/   r0   headersbr_respondergzip_responders          r   __call__zBrotliMiddleware.__call__D   s!    %%e,V}&2259%$777&7;;0"55*		

!!L ugt444&GKK8I2,N"N*488T5F5FGN 666hhugt,,,# 8 5 7,sJ   AD>D6A=D>D8AD>D:D>0D<1D>8D>:D><D>c                 d    |j                  dd      t        fd| j                  D              S )Nr,   r6   c              3   @   K   | ]  }|j                          y wN)search).0patternhandlers     r   	<genexpr>z8BrotliMiddleware._is_handler_excluded.<locals>.<genexpr>`   s     Qw7>>'*Qs   )r:   anyr%   )r+   r.   rF   s     @r   r8   z%BrotliMiddleware._is_handler_excluded]   s*    ))FB'Q$:P:PQQQr   c                     |j                  dd      }h d}d|v r)d|j                  d      d   j                         z   }||v S y)z>Check if the requested file has a compressible file extension.r,   r6   >   .js.md.css.csv.htm.svg.tsv.txt.xml.html.json.F)r:   splitlower)r+   r.   r,   compressible_extensions	extensions        r   r9   z+BrotliMiddleware._is_compressible_file_typed   sR    yy$#
 $;djjob17799I 777r   )   r      r   i  TN)r   r   r   r   r   intstrboollistr-   r   r   r   r?   r8   r9   r   r   r   r   r      s    -
 ".2'('( '( 	'(
 '( '( '( '(  9t+'( 
'(R-E -G -4 -D -2R% RD R $ r   r   c                   b    e Zd ZdZdededededededd	fd
Zdede	de
dd	fdZdedd	fdZd Zy	)r;   zBrotli Interface.r   r   r    r!   r"   r#   r&   Nc                 B   || _         || _        || _        || _        || _        || _        t        | _        i | _        d| _	        d| _
        t        | j                  | j                  | j                  | j                        | _        t        j                         | _        y )NF)r   r    r!   r"   )r   r   r    r!   r"   r#   unattached_sendr0   initial_messagestartedcontent_encoding_setr   br_fileioBytesIO	br_buffer)r+   r   r   r    r!   r"   r#   s          r   r-   zBrotliResponder.__init__~   s     	
()	(*$)!!LLtyy

DLL
 r   r.   r/   r0   c                 h   K   || _         | j                  ||| j                         d {    y 7 wrB   )r0   r   send_with_brotli)r+   r.   r/   r0   s       r   r?   zBrotliResponder.__call__   s)     	hhugt'<'<===s   (202messagec                   K   |d   }|dk(  r*|| _         t        | j                   d         }d|v | _        y|dk(  r\| j                  rP| j                  s*d| _        | j	                  | j                          d{    | j	                  |       d{    y|dk(  rK| j                  s>d| _        |j                  d	d
      }|j                  dd      }t        |      | j                  k  r?|s=| j	                  | j                          d{    | j	                  |       d{    y|s| j                  |      | j                  j                         z   }t        | j                   d         }d|d<   t        t        |            |d<   |j                  d       ||d	<   | j	                  | j                          d{    | j	                  |       d{    yt        | j                   d         }d|d<   |j                  d       |d= | j                  j                  | j                  |      | j                  j!                         z          | j                  j#                         |d	<   | j                  j%                  d       | j                  j'                          | j	                  | j                          d{    | j	                  |       d{    y|dk(  r[|j                  d	d
      }|j                  dd      }| j                  j                  | j                  |      | j                  j!                         z          |s| j                  j                  | j                  j                                | j                  j#                         |d	<   | j                  j)                          | j	                  |       d{    y| j                  j#                         |d	<   | j                  j%                  d       | j                  j'                          | j	                  |       d{    yy7 7 7 C7 -7 7 }7 7 }7 7  w)zApply compression using brotli.r2   zhttp.response.startr<   )rawzcontent-encodingzhttp.response.bodyTNbodyr   	more_bodyFr4   zContent-EncodingzContent-Lengthr5   r   )rd   r   rf   re   r0   r:   lenr#   _processrg   finishr	   r^   add_vary_headerrj   writeflushgetvalueseektruncateclose)r+   rm   message_typer<   rp   rq   s         r   rl   z BrotliResponder.send_with_brotli   s    v00 $+D $"6"6y"ABG(:g(ED%11d6O6O<<#ii 4 4555))G$$$11$,,DL;;vs+DK7I4y4,,,Yii 4 4555ii(((}}T*T\\-@-@-BB(T-A-A)-LM.2*+,/D	N()''(9:"&ii 4 4555ii((( )T-A-A)-LM.2*+''(9:,-$$T]]4%84<<;M;M;O%OP"&.."9"9";##A&'')ii 4 4555ii(((11;;vs+DK7INN  t!4t||7I7I7K!KL$$T\\%8%8%:;"&.."9"9";$$&ii((("nn557GFONN"NN##%))G$$$ 2E 6$ 6( 6( 6( )
 %s   A7Q'9Q:Q'QA;Q'QQ''Q(BQ'QQ'QC,Q'
QQ'#Q $C4Q'Q#A+Q'Q%Q'Q'Q'Q'Q'Q'Q' Q'#Q'%Q'c                     t        | j                  d      r| j                  j                  |      S | j                  j                  |      S )aZ  Workaround to support both brotli and brotlipy

        Before the official Google brotli repository offered a Python version,
        there was a separate package to connect to brotli. These APIs are nearly
        identical except that the official Google API has Compressor.process
        while the brotlipy API has Compress.compress
        process)hasattrrg   r~   compress)r+   rp   s     r   rs   zBrotliResponder._process   s<     4<<+<<''--||$$T**r   )r   r   r   r   r   r]   r   r-   r   r   r   r?   r   rl   rs   r   r   r   r;   r;   {   s    && & 	&
 & & & 
&0>E >G >4 >D ><%g <%$ <%|+r   r;   _r&   c                     K   t        d      w)Nzsend awaitable not set)RuntimeError)r   s    r   rc   rc      s     
/
00s   )r   rh   r)   typingr   brotlir   r   r   r   starlette.datastructuresr   r	   starlette.middleware.gzipr
   starlette.typesr   r   r   r   r   r   r   r;   rc   r   r   r   <module>r      s^   
 
 	  A A < 3 B B ` `Fh+ h+V1W 1 1r   