
    g                     j    d dl mZ d dlm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m
Z
  G d de      Zy)    )Pool)urljoinN)helpers)loggerc                   J    e Zd ZdZddZ	 	 	 	 	 	 	 	 	 	 	 d	dZd
dZd Zd Zy)HTTPHandlerz(
    Retrieve data from Plex Server
    Nc           
         h d| _         || _        t        |t              r)|j	                         xs |j	                  d      | _        n|| _        |r	|| _        nNt        j                  j                  t        j                  j                  t        j                  j                  xs t        j                  j                  t        j                  j                  t        j                  j                  dj!                  t        j                  j                  t        j                  j                        dj!                  t        j                  j"                  t        j                  j                        t        j                  j$                  xs t        j&                  d| _        || _        | j(                  r| j(                  | j                  d<   t+        j,                         | _        || _        |rt3        j4                         nd| _        | j6                  s-t9        j:                  t8        j<                  j>                         d | _         d | _!        d| _"        d	| _#        d| _$        d| _%        d | _&        d
| _'        i | _(        y )N>   GETPUTPOSTDELETE,z{} {}z{} ({}))zX-Plex-ProductzX-Plex-VersionzX-Plex-Client-IdentifierzX-Plex-PlatformzX-Plex-Platform-VersionzX-Plex-DevicezX-Plex-Device-NamezX-Plex-LanguageX-Plex-TokenFr
   rawT))_valid_request_types_silent
isinstancestrspliturlsheadersplexpycommonPRODUCTRELEASECONFIGPMS_CLIENT_IDPMS_UUIDPLATFORMPLATFORM_RELEASEformatPLATFORM_DEVICE_NAMEPMS_LANGUAGESYS_LANGUAGEtokenrequestsSession_sessiontimeoutcertifiwhere
ssl_verifyurllib3disable_warnings
exceptionsInsecureRequestWarninguridatarequest_typeoutput_formatreturn_responsereturn_typecallbackraise_errorsrequest_kwargs)selfr   r   r%   r)   r,   silents          $/opt/Tautulli/plexpy/http_handler.py__init__zHTTPHandler.__init__#   s   $D!dC 

7

3DIDI"DL #)--"7"7"(--"7"7,2MM,G,G,a6==KaKa#)==#9#9+1==+I+I!(0F0F060N0N"P&/&6&6v}}7Y7Y7=}}7L7L'N#)==#=#=#TATATDL 
::+/::DLL( ((*-7'--/U$$W%7%7%N%NO	!"$       c                    t        |      | _        || _        |j                         | _        |j                         | _        || _        || _        |
| _	        || _
        |	xs | j                  | _        || _        | j                  | j                  vrt        j                  d       y|r| j                   D cg c]!  }t#        t        |      | j                        # }}|r| j$                  j'                  dd       |r| j$                  j)                  |       g }| j+                  |      D ]  }|j-                  |        |d   S t        j                  d       yc c}w )zA
        Handle the HTTP requests.

        Output: list
        z5HTTP request made but unsupported request type given.Nr   r   z/HTTP request made but no uri endpoint provided.)r   r1   r2   upperr3   lowerr4   r5   r6   r7   r8   r)   r9   r   r   debugr   r   r   popupdate_http_requests_poolappend)r:   r1   r   r2   r3   r4   r5   r6   no_tokenr)   r7   r8   r9   urlrequest_urls	responsesrs                    r<   make_requestzHTTPHandler.make_requestP   s9   & s8	(..0*002.& (.$,,,D$=$==LLPQCG99MCGCHdhh7MLM  6##G,I--l; $  #$ Q< LLJK Ns   8&Ec              #   "  K   |2t        t        |      |dz        \  }}|r|dz  }t        |      dk(  rd}t        |      dk(  r| j                  |d          yt        |      }	 |j	                  | j                  ||      D ]  }|  	 |j                          |j                          y# t
        $ r.}| j                  st        j                  d|z         Y d}~Sd}~ww xY w# |j                          |j                          w xY ww)z,Generator function to request urls in chunksN      r   zFailed to yield request: %s)divmodlen_http_requests_single
ThreadPoolimap_unordered	Exceptionr   r   errorclosejoin)r:   r   workerschunkextrapoolworkes           r<   rE   zHTTPHandler._http_requests_pool   s      =!#d)Wq[9LE5
4yA~t9>,,T!W55g&D //0J0JDRWX DJ 

		  D||LL!>!BCD 

		sB   A%D(&B0 C* !D0	C'9$C"C* "C''C* *"DDc                    d}d| j                   z  }	  | j                  j                  | j                  |f| j                  | j
                  | j                  | j                  d| j                  }| j                  r|j                          | j*                  rS |ryj,                  }|j.                  }|j                  }|dv r| j1                  ||      S y# t        j                  j                  $ r1}d}| j                  st        j                   |dz   |       Y d}~d}~wt        j                  j"                  $ r1}d}| j                  st        j                   |dz   |       Y d}~d}~wt        j                  j$                  $ r2}d}| j                  st        j                   |dz   |       Y d}~.d}~wt        j                  j&                  $ r2}d}| j                  st        j                   |d	z   |       Y d}~{d}~wt        j                  j(                  $ r2}d}| j                  st        j                   |d
z   |       Y d}~d}~ww xY w)zRequest the data from the urlFz"Failed to access uri endpoint %s. )r   r2   r)   verifyTzRequest timed out: %sNz7Is your server maybe accepting SSL connections only? %szStatus code %szConnection error: %szUncaught exception: %s)      )r1   r(   requestr3   r   r2   r)   r,   r9   r8   raise_for_statusr&   r/   Timeoutr   r   rV   SSLError	HTTPErrorConnectionErrorRequestExceptionr5   status_codecontent_http_format_output)	r:   rH   err	error_msgrK   r^   response_statusresponse_contentresponse_headerss	            r<   rR   z!HTTPHandler._http_requests_single   s   8488C		F%%%d&7&7 kdllY]YbYb.2ll4??kVZViVikA  ""$, H--9999j(++,<>NOO )= ""** 	EC<<Y)@@!D""++ 	gC<<Y)bbdef"",, 	>C<<Y)991=""22 	DC<<Y)??C""33 	FC<<Y)AA1E	FsH   A;C I7'D## I'E// I'F<< I'H		 I)'IIc           	      6   	 | j                   dk(  r|j                  dd      }nq| j                   dk(  rt        j                  |      }nL| j                   dk(  rt        j                  |      }n'| j                   dk(  rt        j
                  |      }n|}| j                  r| j                  |      S | j                  r||d   fS |S # t        $ rH}| j                  s2t        j                  d| j                  d	| j                   d
|       Y d}~yd}~ww xY w)z0Formats the request response to the desired typetextzutf-8ignoredictjsonxmlzContent-Typez Failed format response from uri z to z error N)r4   decoder   convert_xml_to_dictconvert_xml_to_json	parse_xmlr7   r6   rU   r   r   warnr1   )r:   rp   rq   outputr^   s        r<   rl   zHTTPHandler._http_format_output   s    	!!V+)00(C##v- 445EF##v- 445EF##u, **+;<)}}}}V,,/???M 	<<SWS[S[]a]o]oqrst	s$   B/C 2C C 	D>DD)NN
   TF)NNNr
   r   FFFNNT)r~   N)	__name__
__module____qualname____doc__r=   rL   rE   rR   rl    r>   r<   r   r      sG    +!\ !"'#(%*!&#!""&2h2(PTr>   r   )multiprocessing.dummyr   rS   urllib.parser   r*   r&   r-   r   r   r   objectr   r   r>   r<   <module>r      s-   $ 5        B& Br>   