a
   .#,l                
   @   s6  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlZzd dlZW n eyz   Y n0 dd ZejjejjfZe ZG dd de jZdd ZG d	d
 d
ZG dd deejZG dd deZdd Zedkr2z
e  W n. ey0 Z zee W Y dZ[n
dZ[0 0 dS )    N)urlparsec                  C   s"   t tjdd} | sdS |  S d S )Nencoding utf-8)getattrsysstdinlower)r    r
   /usr/bin/wsdump.pyget_encoding   s    r   c                   @   s   e Zd ZdddZdS )VActionNc                 C   sL   |d u rd}zt |}W n  ty8   |dd }Y n0 t|| j| d S )N1v   )int
ValueErrorcountsetattrdest)selfparserargsvaluesoption_stringr
   r
   r   __call__%   s    zVAction.__call__)N)__name__
__module____qualname__r   r
   r
   r
   r   r   #   s   r   c               	   C   s   t jdd} | jdddd | jddd	d
 | jddddtddd | jddddd | jddddd | jddddd | jdd d!d
 | jd"dtd#d$ | jd%d&d'd
 | jd(dd)d | jd*d+d
 |  S ),NzWebSocket Simple Dump Tool)descriptionurlZws_urlz+websocket url. ex. ws://echo.websocket.org/)metavarhelpz-pz--proxyz$proxy url. ex. http://127.0.0.1:8080)r"   z-vz	--verboser   ?verbosezZset verbose mode. If set to 1, show opcode. If set to 2, enable to trace  websocket module)defaultnargsactionr   r"   z-nz--nocert
store_truezIgnore invalid SSL cert)r'   r"   z-rz--rawz
raw outputz-sz--subprotocols*zSet subprotocols)r&   r"   z-oz--originz
Set originz
--eof-waitz'wait time(second) after 'EOF' received.)r%   typer"   z-tz--textzSend initial textz	--timingszPrint timings in secondsz	--headersz(Set custom headers. Use ',' as separator)argparseArgumentParseradd_argumentr   r   
parse_args)r   r
   r
   r   r.   /   sH    



r.   c                   @   s   e Zd Zdd ZdS )RawInputc                 C   s\   t jrt|}nt|}trBtdkrBt|t jsB|td}nt|t jrX|d}|S )Nr   )	sixPY3input	raw_inputENCODING
isinstanceZ	text_typedecodeencode)r   promptliner
   r
   r   r3   O   s    

zRawInput.raw_inputN)r   r   r   r3   r
   r
   r
   r   r/   M   s   r/   c                   @   s   e Zd Zdd Zdd ZdS )InteractiveConsolec                 C   s:   t jd t jd| d  t jd t j  d S )Nz[2K[Ez[34m< z[39mz
> r   stdoutwriteflushr   datar
   r
   r   r=   _   s    zInteractiveConsole.writec                 C   s
   |  dS )Nz> r3   r   r
   r
   r   readf   s    zInteractiveConsole.readNr   r   r   r=   rC   r
   r
   r
   r   r:   ]   s   r:   c                   @   s   e Zd Zdd Zdd ZdS )NonInteractivec                 C   s&   t j| t jd t j  d S )N
r;   r?   r
   r
   r   r=   l   s    zNonInteractive.writec                 C   s
   |  dS )Nr   rA   rB   r
   r
   r   rC   q   s    zNonInteractive.readNrD   r
   r
   r
   r   rE   j   s   rE   c                     sx  t   t   jdkr"td i }  jrJt j}|j| d< |j| d<  j	rZ j	| d<  j
rj j
| d< i } jrtjdd} jrtttj jd	| d
< tj jfd|i|  jrt nt td fdd fdd}tj|d}d|_|   jr" j z  }| W n6 t!yN   Y d S  t"yn   t # j$ Y d S 0 q"d S )Nr   TZhttp_proxy_hostZhttp_proxy_portoriginsubprotocolsF)Z	cert_reqsZcheck_hostname,headerZssloptzPress Ctrl+C to quitc                     s   z   } W n  tjy,   tjjd f Y S 0 | sBtd|  n\| jtv rX| j| jfS | jtjjkrx   | jd fS | jtjj	kr 
| j | j| jfS | j| jfS )NzNot a valid frame %s)Z
recv_frame	websocketZWebSocketExceptionABNFOPCODE_CLOSEopcodeOPCODE_DATAr@   Z
send_closeZOPCODE_PINGZpong)frame)wsr
   r   recv   s    

zmain.<locals>.recvc                     s>   \} }d }t jr4| tjjkr4t|tr4t|d}t|trt|dkr|d d dkrzdtt	
|d }W q   Y q0 n6t|trzdtt
|tj d }W n   Y n0 t|trt|} jrdtjj| |f }n|}|d ur( jrtt  d |  n
| | tjjkr q:q d S )Nr      s   z[gzip] z[zlib] z%s: %sz: )r0   r1   rK   rL   OPCODE_TEXTr5   bytesstrlengzip
decompresszlib	MAX_WBITSreprr$   Z
OPCODE_MAPgetZtimingsr=   timerM   )rN   r@   msg)r   consolerR   
start_timer
   r   recv_ws   s2    

&


 
zmain.<locals>.recv_ws)target)%r^   r.   r$   rK   ZenableTraceproxyr   hostnameportrG   rH   ZnocertsslZ	CERT_NONEZheaderslistmaprV   stripsplitZcreate_connectionr    rawrE   r:   print	threadingThreaddaemonstarttextsendrC   KeyboardInterruptEOFErrorsleepZeof_wait)optionspZoptsrb   threadmessager
   )r   r`   rR   ra   rQ   r   mainu   sL    






"r{   __main__)r+   coder   rn   r^   rg   rX   rZ   r0   Zsix.moves.urllib.parser   rK   readlineImportErrorr   rL   rT   ZOPCODE_BINARYrO   r4   Actionr   r.   r/   r:   rE   r{   r   	Exceptionerm   r
   r
   r
   r   <module>   s8   `

