
    +Jf*                        d dl mZ d dlmZ d dlZd dlZd dlmZmZ d dl	m
Z
 d dlZd dl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mZmZmZmZ ej        d          d
k    s"ej        d          d
k    rej        d
         dk    r	d dlmZ eZ ne!Z da" ej#                    Z$d Z% G d de!          Z& G d de!          Z'd Z(d Z) e)             d Z*d Z+d Z,d Z-d Z.d Z/ddddi fdZ0d"dZ1	 	 d#dZ2d Z3d Z4 G d  d!e           Z5dS )$    )	b64encode)packN)WRAPPER_ASSIGNMENTSwraps)parse_options_header)settings)HttpResponseHttpResponseBadRequest)Item)	ChannelGripPubControlWebSocketEventWebSocketContextparse_grip_urivalidate_sigcreate_grip_channel_headerdecode_websocket_eventsencode_websocket_events   
   )MiddlewareMixinc                     	 t          | t                    rdS n(# t          $ r t          | t                    rY dS Y nw xY wdS )NTF)
isinstance
basestring	NameErrorstr)instances    N/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/django_grip.py_is_basestring_instancer      sh    *%% 
$   # 
$$  	s    ??c                   <    e Zd Zd Zd Zd Zd	dZd Zd Zd	dZ	dS )
GripInstructc                 v    d| _         g | _        d| _        d| _        d| _        d| _        d| _        i | _        d S )N r   )holdchannelstimeout
keep_alivekeep_alive_timeout	next_linknext_link_timeoutmetaselfs    r   __init__zGripInstruct.__init__%   s@    $)$-$,$/$$.$$)))    c                     t          |          rt          |          }t          |t                    sJ | j                            |           d S N)r   r   r   r%   append)r-   channels     r   add_channelzGripInstruct.add_channel/   sQ    W%% W7	GW	%	%&&&-wr/   c                     t          |t                    st          |          r|g}|D ]}|                     |           d S r1   )r   r   r   r4   )r-   r%   cs      r   add_channelszGripInstruct.add_channels5   s[    '"" &=h&G&G j8  aA r/   Nc                 D    d| _         |rt          |          | _        d S d S )Nresponse)r$   intr&   )r-   r&   s     r   set_hold_longpollzGripInstruct.set_hold_longpoll;   s,    $) g,,4<<< r/   c                     d| _         d S )Nstream)r$   r,   s    r   set_hold_streamzGripInstruct.set_hold_stream@   s    $)))r/   c                 <    || _         t          |          | _        d S r1   )r'   r:   r(   )r-   datar&   s      r   set_keep_alivezGripInstruct.set_keep_aliveC   s    $/LL$r/   c                 D    || _         |rt          |          | _        d S d S r1   )r)   r:   r*   )r-   urir&   s      r   set_next_linkzGripInstruct.set_next_linkG   s/    $. )LL4) )r/   r1   )
__name__
__module____qualname__r.   r4   r7   r;   r>   rA   rD    r/   r   r!   r!   $   s                    
  ) ) )) ) ) ) ) )r/   r!   c                       e Zd Zd Zd ZdS )GripDatac                 d    d| _         d| _        t                      | _        i | _        d | _        d S )NF)proxiedsignedsetfeatureslastinstructr,   s    r   r.   zGripData.__init__M   s-    $,$+%%$-$)$---r/   c                 b    | j         rt          d          t                      | _         | j         S )NzGRIP instruct already started)rQ   
ValueErrorr!   r,   s    r   start_instructzGripData.start_instructT   s.    	] 5	3	4	44..$-	r/   N)rE   rF   rG   r.   rT   rH   r/   r   rJ   rJ   L   s2              r/   rJ   c                      t          t          dg           } t          t          dd           }|r"|                     t          |                     t          t          dd           }|r| D ]}d|vr||d<   | S )NGRIP_PROXIESGRIP_URLGRIP_VERIFY_KEY
verify_key)getattrr   r2   r   )proxiesgrip_urlrY   ps       r   _get_proxiesr^   [   s    8^R00Hj$// +	..))***h 1488 ! ! !a! AlOr/   c                      t                                            t          4t                      at                              t                                 t                                            t          S r1   )_lockacquire_pubcontrolr   apply_grip_configr^   releaserH   r/   r   _get_pubcontrolre   i   sK      +///r/   c                  .    t          t          dd          S )NGRIP_PREFIXr#   )rZ   r   rH   r/   r   _get_prefixrh   u   s    -,,,r/   c                 6    d}| D ]}|dk    r|dz  }||z  }|S )Nr#   "z\"rH   soutr6   s      r   _escape_paramrn   x   s:    	
  Q#XX%<33!833r/   c                    t          | t          j                  s|                     d          } d}| D ]L}|dk    r|dz  }|dk    r|dz  }|dk    r|dz  }%t	          |          d	k     rt          d
          ||z  }M|S )Nutf-8r#   \z\\z\r
z\n    znot cstring encodable)r   six	text_typedecodeordrS   rk   s      r   _cstring_encodery      s    1cm$$ hhw!	
 
 
Q$YY&=3$YY%<33Dyy%<33
1vv}}	+	,	,,!833r/   c                     	 t          |           }d|z  }n"# t          $ r dt          |           z  }Y nw xY w|d|z  z  }|S )Nz%s; format=cstringz%s; format=base64; timeout=%d)ry   	Exceptionr   )r@   r&   cshvalues       r   _keep_alive_headerr      se    1t""$&& 1 1 140&&&1 >G##s    66c                     d}t          j        |           D ]5\  }}t          |          dk    r|dz  }||dt          |          dz  }6|S )Nr#   r   , z="rj   )ru   	iteritemslenrn   )r+   r~   kvs       r   _set_meta_headerr      sd    
]4   . .TQ[[1__	T>6M!,,,,--&&r/   c                      t                      S r1   )re   rH   r/   r   get_pubcontrolr      s    r/   Fc           	          t                      }|                    t                      | z   t          ||||          ||           d S )N)idprev_idr+   )blockingcallback)re   publishrh   r   )r3   formatsr   r   r   r   r+   pubs           r   r   r      sW    []]W$w2wT222      r/   c                     | j                                         }|                    |           |                    |           d S )Nr&   )griprT   r7   r;   )requestr%   r&   rQ   s       r   r;   r;      sF    L''))	x   	G,,,,,r/   c                     | j                                         }|                    |           |                                 |r*|st	          d          |                    ||           d S d S )NzCif keep_alive_data is set, then keep_alive_timeout must also be setr   )r   rT   r7   r>   rS   rA   )r   r%   keep_alive_datar(   rQ   s        r   r>   r>      s    L''))	x   	 G	 ,	 + 
, 
, ,
/3EFFFFF	G Gr/   c                 Z    d}| D ]%}|dk    r|dz  }||                                 z  }&|S )Nr#   _-)lower)namerm   r6   s      r   _convert_header_namer      sC    	
  Q#XX#:33!''))33r/   c                 Z      fd}d|_          t           t                    |          S )Nc                  8     | i |}|t                      S |S r1   )r	   )argskwargsr9   	view_funcs      r   wrapped_viewz$websocket_only.<locals>.wrapped_view   s,    Y'''(
..	/r/   T)assigned)websocket_onlyr   r   )r   r   s   ` r   r   r      sD          $6i"5666|DDDr/   c                        e Zd Zd Zd Zd ZdS )GripMiddlewarec                    t                      |_        d |_        d|_        d|_        d}d}|j                            d          }|rrt                      }d}|D ]}d|vrd|vrd} n|rM|D ]I}|                    d|d                   }t          |||                    d                    rd}d} nJnd}|j                            d          }	|	rD|		                    d	          }
t                      }|                    |
           ||j        _        |j                            d
          }	|	rQi }|		                    d          D ]-}t          |          \  }}|                    dd          ||<   .||j        _        t          |d          r|j        }n5d}|j                            d          }	|	rt          |	          }
|
d         }d }|j        dk    r|dk    r|j                            d          }i }t%          j        |j                  D ]4\  }}|                    d          r||t+          |dd                    <   5|j        }t/          |t$          j                  r|                    d          }	 t5          |          }n#  t7          d          cY S xY wt9          |||t;                                }||j        _        ||j        _        ||_        ||_        ||_        d S )NFHTTP_GRIP_SIGTrY   key
verify_iss)issHTTP_GRIP_FEATUREr   HTTP_GRIP_LAST,zlast-idr#   content_typeCONTENT_TYPEr   POSTapplication/websocket-eventsHTTP_CONNECTION_ID
HTTP_META_r   rp   z Error parsing WebSocket events.
)grip_prefix) rJ   r   	wscontextgrip_proxiedgrip_signedMETAgetr^   r   splitrN   updaterO   r   rP   hasattrr   methodru   r   
startswithr   bodyr   rv   encoder   r
   r   rh   rL   rM   )r-   r   rL   rM   grip_sig_headerr[   all_proxies_have_keysentryr   r~   parsedrO   rP   hvalr3   paramsr   r   cidr+   r   r   r   eventss                           r   process_requestzGripMiddleware.process_request   se   ',' '''&L$$_55/ ^^7  u5  U%%7%7"
U    99\5<00S_cuyy/F/FGGG gfe G </00& $LL6ee8??6#7< <,--& 
4||C   . .t*400OGVJJy"--DMM7<Wn%% &<<<L^,,6 !&))F!9L )n222			.	/	/3
4}W\** , ,tq!||L!! ,*+T
qv
&
&'
,4s}%%  ;;wD+$T**FF+!)+ + + + +  T6     9 !',',' !''s   	J J,c                 X    t          |dd          r|j        st          d          S d S d S )Nr   Fz'Request must contain WebSocket events.
)rZ   r   r
   )r-   r   r   	view_argsview_kwargss        r   process_viewzGripMiddleware.process_view2  sK    i)511 11
 /1 1 11 1 1 1r/   c           	         t          |dd           r|j        dk    rt          |j                  dk    r|j        }t                      }t          j        |j                  D ]Y\  }}d}t          j        |j	                  D ]!\  }}	|
                                |k    rd} n"|s|                    |           Zi }
t          j        |j	                  D ]Q\  }}|
                                }d}t          j        |j                  D ]\  }}||k    r
||k    rd} n|r||
|<   Rg }|j        r"|                    t          d                     |                    |j                   |j        r6|                    t          dt%          d|j                                       t)          t+          |          d	
          }|j        rd|d<   |D ]
}d|d|z   <   t          j        |
          D ]\  }}||d|z   <   nJ|j        j        }|r;|j        j        s't          t2          dd          rt)          dd          S |j        r(|j        dk    rd|_        d|_        d|d<   |j        |d<   t9                      }|r|j        D ]}||j        z   |_        t?          |j                  |d<   |j        rd|j         dk    rtC          |j                   |d<   |j"        rtG          |j"        |j$                  |d<   |j	        rtK          |j	                  |d<   |j&        r'd|j&        z  }|j'        dk    r|d|j'        z  z  }||d<   |S )Nr      r   FTOPENCLOSEz>Hr   )r   r   zSec-WebSocket-Extensionsr#   z	Set-Meta-GRIP_PROXY_REQUIREDzNot Implemented
i  )statusi0  OK304zGrip-Statusz	Grip-HoldzGrip-ChannelzGrip-TimeoutzGrip-Keep-AlivezGrip-Set-Metaz<%s>; rel=nextr{   z	Grip-Link)(rZ   status_coder   contentr   rN   ru   r   	orig_metar+   r   addacceptedr2   r   extend
out_eventsclosedr   out_close_coder	   r   r   rQ   rL   r   r$   reason_phraserh   r%   r   r   r&   r   r'   r   r(   r   r)   r*   )r-   r   r9   r   meta_remover   r   foundnknvmeta_setlnameneed_setokovr   rQ   prefixr6   r~   s                       r   process_responsezGripMiddleware.process_response8  s    g{D)) Z$CQ 9 ;}Y011  tq!E-	//  B


aee 	  __Q 8}Y^,,  tq!GGIIEH-	 344  BRhe Xe_6 *
MM.(()))	==%&&& -
MM.
4)**, , - - - 26::02 2 28 2+1H'( # #q "H[1_}X&& " "tq! !H[1_" l#8 +$L  :h-u55:,S9999} 
+
 	## h#h %h}%]Xk ]]F   aff9   H^ } 1!$X%5!6!6h~ %$6#%% %%h ! 	 "2# #h  $!33V"Q&&!;;;f#Xk	/r/   N)rE   rF   rG   r   r   r   rH   r/   r   r   r      sJ        \ \ \|1 1 1_ _ _ _ _r/   r   r1   )NN)6base64r   structr   	threadingru   	functoolsr   r   werkzeug.httpr   djangodjango.confr   django.httpr	   r
   
pubcontrolr   gripcontrolr   r   r   r   r   r   r   r   r   VERSIONdjango.utils.deprecationr   middleware_parentobjectrb   Lockr`   r   r!   rJ   r^   re   rh   rn   ry   r   r   r   r   r;   r>   r   r   r   rH   r/   r   <module>r      s+                   



 0 0 0 0 0 0 0 0 . . . . . .              < < < < < < < <                           
 
>!qV^A.!33.r555555$ 	  &) &) &) &) &)6 &) &) &)P    v           - - -    "       "&teb   - - - -
 8<	G 	G 	G 	G  	E 	E 	ED D D D D& D D D D Dr/   