from enum import Enum from typing import Optional, List, Dict, Any from pydantic import BaseModel, Field class RequestMethod(str, Enum): GET = "GET" POST = "POST" PUT = "PUT" PATCH = "PATCH" DELETE = "DELETE" HEAD = "HEAD" OPTIONS = "OPTIONS" class Header(BaseModel): key: str value: str def to_tuple(self) -> tuple[str, str]: return (self.key, self.value) class AuthType(str, Enum): BASIC = "basic" BEARER = "bearer" DIGEST = "digest" class Auth(BaseModel): auth_type: AuthType = AuthType.BASIC username: Optional[str] = None password: Optional[str] = None token: Optional[str] = None def get_header(self) -> Optional[Header]: if self.auth_type == AuthType.BASIC and self.username and self.password: import base64 credentials = f"{self.username}:{self.password}" encoded = base64.b64encode(credentials.encode()).decode() return Header(key="Authorization", value=f"Basic {encoded}") elif self.auth_type == AuthType.BEARER and self.token: return Header(key="Authorization", value=f"Bearer {self.token}") return None class DataType(str, Enum): RAW = "raw" JSON = "json" FORM = "form" FILE = "file" class RequestData(BaseModel): data_type: DataType = DataType.RAW content: str = "" json_data: Optional[Dict[str, Any]] = None class ParsedCurl(BaseModel): url: str method: RequestMethod = RequestMethod.GET headers: List[Header] = Field(default_factory=list) auth: Optional[Auth] = None data: Optional[RequestData] = None cookies: Dict[str, str] = Field(default_factory=dict) user_agent: Optional[str] = None follow_redirects: bool = True timeout: Optional[int] = None