
    ?i                     
   d 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	m
Z
mZ ddlmZ dZej                  j!                  dd      j#                         dv Zd	efd
ZdZdZdZ G d de      Zddeedfdededee
eef      dee
ee	f      dededede
ee	f   fdZddedee
eef      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e	f   fdZddede
ee	f   dee
eef      defdZeefdededede
ee	f   fdZy) z2HTTP utilities for last30days skill (stdlib only).    N)AnyDictOptional)	urlencode   LAST30DAYS_DEBUG )1trueyesmsgc                     t         rBt        j                  j                  d|  d       t        j                  j	                          yy)zLog debug message to stderr.z[DEBUG] 
N)DEBUGsysstderrwriteflush)r   s    O/home/ubuntu/.openclaw/workspace/skills/last30days-official/scripts/lib/http.pylogr      s5    

8C5+,

        g       @z&last30days-skill/2.1 (Assistant Skill)c                   >     e Zd ZdZddedee   dee   f fdZ xZS )	HTTPErrorz$HTTP request error with status code.messagestatus_codebodyc                 @    t         |   |       || _        || _        y N)super__init__r   r   )selfr   r   r   	__class__s       r   r!   zHTTPError.__init__   s    !&	r   )NN)	__name__
__module____qualname____doc__strr   intr!   __classcell__)r#   s   @r   r   r      s.    . (3- hWZm  r   r   Fmethodurlheaders	json_datatimeoutretriesrawreturnc           
         |xs i }|j                  dt               d}|6t        j                  |      j	                  d      }|j                  dd       t
        j                  j                  ||||       }t        |  d|        d}	t        |      D ]  }
	 t
        j                  j                  ||      5 }|j                         j                  d      }t        d	|j                   d
t        |       d       |r|cddd       c S |rt        j                  |      ni cddd       c S  |	r|	t#        d       # 1 sw Y   nxY w# t
        j                   j"                  $ r}d}	 |j                         j                  d      }n#  Y nxY wt        d|j$                   d|j&                          |r0dj)                  |j+                               }t        d|dd         t#        d|j$                   d|j&                   |j$                  |      }	d|j$                  cxk  rdk  rn n|j$                  dk7  r|	|
|dz
  k  r|j$                  dk(  r~t-        |d      r|j.                  j1                  d      nd}|r+	 t3        |      }n-# t4        $ r t6        d|
z  z  dz   }Y nw xY wt6        d|
z  z  dz   }t        d|dd|
dz    d|        nt6        d|
z  z  }t9        j:                  |       Y d}~od}~wt
        j                   j<                  $ rb}t        d|j&                          t#        d|j&                         }	|
|dz
  k  rt9        j:                  t6        |
dz   z         Y d}~d}~wt        j>                  $ r#}t        d|        t#        d|       }	|	d}~wt@        tB        tD        f$ rz}t        dtG        |      jH                   d|        t#        dtG        |      jH                   d|       }	|
|dz
  k  rt9        j:                  t6        |
dz   z         Y d}~d}~ww xY w)!a  Make an HTTP request and return JSON response.

    Args:
        method: HTTP method (GET, POST, etc.)
        url: Request URL
        headers: Optional headers dict
        json_data: Optional JSON body (for POST)
        timeout: Request timeout in seconds
        retries: Number of retries on failure

    Returns:
        Parsed JSON response (or raw text if raw=True)

    Raises:
        HTTPError: On request failure
    
User-AgentNzutf-8zContent-Typeapplication/json)datar-   r+    )r/   z
Response: z (z bytes)zHTTP Error z: zError body:    zHTTP i  i  i     r-   zRetry-After   zRate limited (429). Waiting z.1fzs before retry /zURL Error: zJSON decode error: zInvalid JSON response: zConnection error: z$Request failed with no error details)%
setdefault
USER_AGENTjsondumpsencodeurllibrequestRequestr   rangeurlopenreaddecodestatuslenloadserrorr   codereasonjoinsplithasattrr-   getfloat
ValueErrorRETRY_DELAYtimesleepURLErrorJSONDecodeErrorOSErrorTimeoutErrorConnectionResetErrortyper$   )r+   r,   r-   r.   r/   r0   r1   r6   req
last_errorattemptresponser   esnippetretry_afterdelays                    r   rB   rB   "   s   2 mG|Z0Dzz)$++G4>+=>
..
 
 4
 
PC6(!C5J> 584	8''W'= 8}}--g6j 1CI;gFG	8 8
 ,0tzz$'R8 858n 
:
;;o8 8 8 ||%% 	"Dvvxw/+affXRz23((4::<0l74C=/23"U166("QXXJ#?NJ aff"s"qvv}  1$66S=BI!YBW!))--">]aK"E$)+$6E) E$/1<$@1$DEE !,qG| <q @6uSkQX[\Q\P]]^_f^ghi'1<8E

5!||$$ 	8+ahhZ()"[
#;<J1$

;'A+67## 	%aS)*"%<QC#@AJ';< 	8$T!W%5%5$6b<="%7Q8H8H7IA3#OPJ1$

;'A+67	8s   !E<AE	EE(	EE		EQ/L2FLFC8LJLJ41L3J44AL Q&ANQN77QA/QQc                      t        d| fd|i|S )zMake a GET request.GETr-   rB   )r,   r-   kwargss      r   rQ   rQ      s    5#9w9&99r   c                 "    t        d| f||d|S )z#Make a POST request with JSON body.POST)r-   r.   rg   r,   r.   r-   rh   s       r   postrl      s    63O9OOOr   c                 $    t        d| f||dd|S )z7Make a POST request with JSON body and return raw text.rj   T)r-   r.   r1   rg   rk   s       r   post_rawrn      s    63Y9$YRXYYr   pathc                     | j                  d      sd| z   } | j                  d      } | j                  d      s| dz   } d|  d}t        dd}t	        ||||      S )zFetch Reddit thread JSON.

    Args:
        path: Reddit path (e.g., /r/subreddit/comments/id/title)
        timeout: HTTP timeout per attempt in seconds
        retries: Number of retries on failure

    Returns:
        Parsed JSON response
    r;   z.jsonzhttps://www.reddit.comz?raw_json=1r5   )r4   Accept)r-   r/   r0   )
startswithrstripendswithr=   rQ   )ro   r/   r0   r,   r-   s        r   get_reddit_jsonru      sn     ??3Tz ;;sD==!g~"4&
4C !$G
 sGWgFFr   r   ) r'   r>   osr   rU   urllib.errorrA   urllib.requesttypingr   r   r   urllib.parser   DEFAULT_TIMEOUTenvironrQ   lowerr   r(   r   MAX_RETRIESrT   r=   	Exceptionr   r)   boolrB   rl   rn   ru    r   r   <module>r      s   8  	 
    & & "


)2.446:NNS 
 5
	  )-*."_<_<	_< d38n%_< S#X'	_<
 _< _< 
_< 
#s(^_<D:S :8DcN3 :cSVh :
Pc Pd38n PxS#X7O Peijmorjres P
Z# Z$sCx. Z8DcN;S Zil Z
 />k G# G G G^bcfhkck^l Gr   