o
    øT·jÀ  ã                   @  s¸   d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	 ddl
mZmZ ddlmZ eG dd	„ d	ƒƒZd"dd„Zd#dd„Z	d$d%dd„Zeh d£ƒZ	d$d%dd„Zd&d d!„ZdS )'é    )ÚannotationsN)Ú	dataclassÚfield)ÚSessioné   )ÚSUPPORTED_METHODSÚprocess_url)Ú_execute_requestc                   @  sH   e Zd ZU dZdZded< dZded< eed�Z	ded	< dZ
ded
< dS )ÚHttpFileRequestz+A single request parsed from an .http file.ÚGETÚstrÚmethodÚ Úurl)Údefault_factoryzdict[str, str]ÚheadersÚbodyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   Údictr   r   © r   r   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/curl_cffi/cli/run.pyr
      s   
 r
   Útextr   Úreturnúlist[HttpFileRequest]c                 C  s|   g }g }|   ¡ D ]}| ¡  d¡r|r| |¡ g }q| |¡ q|r(| |¡ g }|D ]}t|ƒ}|dur;| |¡ q,|S )z€Parse an .http file into a list of requests.

    Supports the HTTP Request in Editor spec:
    - Requests separated by ###
    z###N)Ú
splitlinesÚstripÚ
startswithÚappendÚ_parse_http_block)r   ÚblocksÚcurrent_linesÚlineÚrequestsÚblock_linesÚreqr   r   r   Úparse_http_file   s$   
€

€r)   Úlinesú	list[str]úHttpFileRequest | Nonec              	   C  sÄ  d}d}d}i }g }| D ]Ä}|  ¡ }| d¡s| d¡rq| dkrT |s&q| ¡ }|d  ¡ tv s:|d  ¡ dkrM|d  ¡ }t|ƒdkrJ|d nd}n|d }d	}n| d	kr{ |s^d
}qd|v rs| d¡\}	}
}|  ¡ ||	  ¡ < qd
}| |¡ qd
krÐ| d¡sˆ| d¡rŠ nG| d¡rÊ| ¡ \}
}|  ¡ }zt|ƒ�}| | 	¡ ¡ W d  ƒ n1 s°w   Y  W q t
yÉ   td|› �tjd� Y qw | |¡ qq|sÕdS t|||d |¡  ¡ d�S )zôParse a single request block from an .http file.

    Each block contains:
    - Request line: [METHOD] URL [HTTP/version]
    - Headers: Name: Value
    - Body after blank line
    - Comments with # or //
    - File references: < filepath
    Úrequestr   r   ú#z//r   ÚCONNECTr   r   r   ú:z> z<> z< Nz"Error: referenced file not found: ©ÚfileÚ
)r   r   r   r   )r   r    ÚsplitÚupperr   ÚlenÚ	partitionr!   ÚopenÚreadÚFileNotFoundErrorÚprintÚsysÚstderrr
   Újoin)r*   Ústater   r   r   Ú
body_linesr%   ÚstrippedÚpartsÚnameÚ_ÚvalueÚfilepathÚfr   r   r   r"   8   sn   



ÿ€
þÿ€ür"   Úargsúargparse.NamespaceÚsessionúSession | NoneÚintc           	   	   C  s¢   t |ƒ}|stdtjd� t d¡ d}t|dƒD ]5\}}| js2td|› d|j› d|j› �tjd� t	|jƒ}t
| |j||j|jpBd|d	�}|dkrN|d7 }q|S )
z0Execute requests parsed from .http file content.z!Error: no requests found in file.r1   r   r   ú--- [ú] ú N©r   ÚdatarJ   )r)   r;   r<   r=   ÚexitÚ	enumerateÚquietr   r   r   r	   r   r   )	rH   r   rJ   r&   ÚfailedÚir(   r   Úrcr   r   r   Ú_run_http_file†   s*   
$
ú€rX   >   ú:pathú:methodú:schemeú
:authorityúcontent-lengthútransfer-encodingc              
   C  s’  zt  |¡}W n" t jy) } ztd|› �tjd� t d¡ W Y d}~nd}~ww | di ¡ dg ¡}|sBtdtjd� t d¡ d}t|dƒD ]}\}}| d	i ¡}	|	 d
d¡ 	¡ }
|	 dd¡}|sotd|› d�tjd� qI| j
s‚td|› d|
› d|› �tjd� i }|	 dg ¡D ]}| dd¡}| ¡ tvr | dd¡||< qŠ|p¤d}|	 d¡}|r²| dd¡nd}t| |
||||d�}|dkrÆ|d7 }qI|S )z.Execute requests parsed from HAR file content.zError: invalid HAR JSON: r1   r   NÚlogÚentriesz$Error: no entries found in HAR file.r   r-   r   r   r   r   rM   z] skipping entry with no URLrN   rO   r   rC   rE   ÚpostDatar   rP   )ÚjsonÚloadsÚJSONDecodeErrorr;   r<   r=   rR   ÚgetrS   r5   rT   ÚlowerÚ_SKIP_HAR_HEADERSr	   )rH   r   rJ   ÚharÚexcr`   rU   rV   Úentryr(   r   r   r   ÚhrC   Ú	post_datarQ   rW   r   r   r   Ú_run_har_fileµ   sT   €þ
 €
ú€rm   ÚNonec                 C  s0  | j }zt|ƒ�}| ¡ }W d  ƒ n1 sw   Y  W n ty5   td|› �tjd� t d¡ Y nw t| ddƒ}|rDt	| j
d�nd}z1| d¡rTt| ||d	�}n| d
¡rat| ||d	�}ntd|› �tjd� t d¡ W |rw| ¡  n|r| ¡  w w |dkr–td|› d�tjd� t d¡ dS dS )zExecute batch requests.NzError: file not found: r1   r   rJ   T)Úimpersonatez.har)rJ   z.httpz Error: unsupported file format: r   r3   z request(s) failed.)r2   r8   r9   r:   r;   r<   r=   rR   Úgetattrr   ro   Úendswithrm   rX   Úclose)rH   rF   rG   r   Úuse_sessionrJ   rU   r   r   r   Ú
handle_runî   s<   

ÿ€þ


€€ÿ
ÿþrt   )r   r   r   r   )r*   r+   r   r,   )N)rH   rI   r   r   rJ   rK   r   rL   )rH   rI   r   rn   )Ú
__future__r   Úargparserb   r<   Údataclassesr   r   Úcurl_cffi.requestsr   Úparser   r   r-   r	   r
   r)   r"   rX   Ú	frozensetrg   rm   rt   r   r   r   r   Ú<module>   s(    	
	
Oÿ#ÿÿ9