70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
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
|