
    SjA                     n    d Z ddlZddlmZmZmZ ddlmZmZm	Z	 ddl
Z
ddlmZ  e       Z G d d      Zy)	z#
HTTP client utilities for v2 API.
    N)DictAnyOptional)urlparse
urlunparseurljoin   )get_versionc                      e Zd ZdZ	 	 	 ddee   dedee   dedef
dZd	ed
efdZ	ddee   d
e
eef   fdZ	 	 	 	 dd	ede
eef   dee
eef      dee   dee   dee   d
ej                  fdZ	 	 	 	 dd	edee
eef      dee   dee   dee   d
ej                  fdZ	 	 	 	 dd	edee
eef      dee   dee   dee   d
ej                  fdZy)
HttpClientz0HTTP client with retry logic and error handling.Napi_keyapi_urltimeoutmax_retriesbackoff_factorc                 J    || _         || _        || _        || _        || _        y N)r   r   r   r   r   )selfr   r   r   r   r   s         Q/root/.hermes/venv/lib/python3.12/site-packages/firecrawl/v2/utils/http_client.py__init__zHttpClient.__init__   s)     &,    endpointreturnc                    t        | j                        }t        |      }|j                  r|j                  xs d}|j                  xs d|j                  xs dk7  r3t        |j                  xs d|j                  |d|j                  df      S t        |j                  xs d|j                  |d|j                  df      S | j                  j                  d      r| j                  n| j                   d}|j                  d      rQt        d|       }|j                  xs d}t        |j                  xs d|j                  |d|j                  df      S t        ||      S )N/ httpsz//zhttps:)r   r   netlocpathhostnamer   schemequeryendswith
startswithr   )r   r   baseepr   base_strep2s          r   
_build_urlzHttpClient._build_url   s.   %h 9977>cD!rt}}':;!4;;#9'4;;bRTRZRZ\^"_``t{{5gt{{D"bhhXZ[\\ $(<<#8#8#=4<<dll^STCUt$VH:./C88?sDt{{5gt{{D"ciiY[\]]x**r   idempotency_keyc                 X    ddi}| j                   rd| j                    |d<   |r||d<   |S )z!Prepare headers for API requests.zContent-Typezapplication/jsonzBearer Authorizationzx-idempotency-key)r   )r   r*   headerss      r   _prepare_headerszHttpClient._prepare_headers4   sB     .
 <<)0'?GO$+:G'(r   datar-   retriesc                 <   || j                         }|| j                  }|| j                  }|| j                  }dt         |d<   | j                  |      }d}t        d|      }	t        |	      D ]R  }
	 t        j                  ||||      }|j                  dk(  r$|
|	dz
  k  rt        j                  |d|
z  z         P|c S  |xs t        d      # t        j                  $ r1}|}|
|	dz
  k(  r|t        j                  |d|
z  z         Y d}~d}~ww xY w)	z%Make a POST request with retry logic.Nzpython-sdk@originr	   )r-   jsonr        z Unexpected error in POST request)r.   r   r   r   versionr)   maxrangerequestspoststatus_codetimesleepRequestException	Exception)r   r   r/   r-   r   r0   r   urllast_exceptionnum_attemptsattemptresponsees                r   r:   zHttpClient.postB   s;    ?++-G?llG?&&G!!00N&wi0Xooh'1g\* 	<G<#==##	 ''3.!11

>Q'\#BC 	<. M	*L MM ,, <!"lQ..G

>Q'\:;;	<s   7ACCD*'DDc                 "   || j                         }|| j                  }|| j                  }|| j                  }| j	                  |      }d}t        d|      }t        |      D ]Q  }		 t        j                  |||      }
|
j                  dk(  r$|	|dz
  k  rt        j                  |d|	z  z         O|
c S  |xs t        d      # t        j                  $ r1}|}|	|dz
  k(  r|t        j                  |d|	z  z         Y d}~d}~ww xY w)z$Make a GET request with retry logic.Nr	   r-   r   r4   r5   zUnexpected error in GET request)r.   r   r   r   r)   r7   r8   r9   getr;   r<   r=   r>   r?   r   r   r-   r   r0   r   r@   rA   rB   rC   rD   rE   s               r   rH   zHttpClient.getu   s(    ?++-G?llG?&&G!!00Nooh'1g\* 	<G<#<<## ''3.!11

>Q'\#BC 	<, L	*K LL ,, <!"lQ..G

>Q'\:;;	<   +A
C
6C

D'D		Dc                 "   || j                         }|| j                  }|| j                  }|| j                  }| j	                  |      }d}t        d|      }t        |      D ]Q  }		 t        j                  |||      }
|
j                  dk(  r$|	|dz
  k  rt        j                  |d|	z  z         O|
c S  |xs t        d      # t        j                  $ r1}|}|	|dz
  k(  r|t        j                  |d|	z  z         Y d}~d}~ww xY w)z'Make a DELETE request with retry logic.Nr	   rG   r4   r5   z"Unexpected error in DELETE request)r.   r   r   r   r)   r7   r8   r9   deleter;   r<   r=   r>   r?   rI   s               r   rL   zHttpClient.delete   s(    ?++-G?llG?&&G!!00Nooh'1g\* 	<G<#??## ''3.!11

>Q'\#BC 	<, O	*N OO ,, <!"lQ..G

>Q'\:;;	<rJ   )N   g      ?r   )NNNN)__name__
__module____qualname____doc__r   strfloatintr   r)   r   r.   r   r9   Responser:   rH   rL    r   r   r   r      s   : $( #-#- - %	-
 - -+3 +3 +, cSVh $ -1#'!%*.1N1N 38n1N $sCx.)	1N
 %1N #1N !1N 
		1Nl -1#'!%*.-M-M $sCx.)-M %	-M
 #-M !-M 
		-Md -1#'!%*.-P-P $sCx.)-P %	-P
 #-P !-P 
		-Pr   r   )rQ   r<   typingr   r   r   urllib.parser   r   r   r9   r
   r6   r   rV   r   r   <module>rY      s6     & & 6 6  $
-DP DPr   