# httpmorph
 [](https://codecov.io/gh/arman-bd/httpmorph) [](https://pypi.org/project/httpmorph/) [](LICENSE)
A Python HTTP client focused on mimicking browser fingerprints.
**⚠️ Work in Progress** - This library is in early development. Features and API may change.
## Features
- **Requests-compatible API** - Drop-in replacement for most Python `requests` use cases
- **High Performance** - Native C implementation with BoringSSL for HTTP/HTTPS
- **HTTP/2 Support** - Full HTTP/2 with ALPN negotiation via nghttp2 (httpx-like API)
- **Browser Fingerprinting** - Realistic browser profiles (Chrome and it's variants)
- **TLS Fingerprinting** - JA3 fingerprint generation and customization
- **Connection Pooling** - Automatic connection reuse for better performance
- **Session Management** - Persistent cookies and headers across requests
## Installation
```bash
pip install httpmorph
```
### Requirements
- Python 3.8+
- Windows, macOS, or Linux
- BoringSSL (built automatically from source)
- libnghttp2 (for HTTP/2)
## Quick Start
```python
import httpmorph
# Simple GET request
response = httpmorph.get('https://icanhazip.com')
print(response.status_code)
print(response.text)
# POST with JSON
response = httpmorph.post(
'https://httpbin.org/post',
json={'key': 'value'}
)
# Using sessions
session = httpmorph.Session(browser='chrome')
response = session.get('https://example.com')
# HTTP/2 support (httpx-like API)
client = httpmorph.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version) # '2.0'
```
## Browser Profiles
Mimic real browser behavior with pre-configured profiles:
```python
# Use Chrome fingerprint
response = httpmorph.get('https://example.com', browser='chrome')
# Use Firefox fingerprint
session = httpmorph.Session(browser='firefox')
response = session.get('https://example.com')
# Available browsers: chrome, firefox, safari, edge
```
## Advanced Usage
### HTTP/2 Support
httpmorph supports HTTP/2 with an httpx-like API:
```python
# Enable HTTP/2 for a client (default is False)
client = httpmorph.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version) # '2.0'
# Enable HTTP/2 for a session
session = httpmorph.Session(browser='chrome', http2=True)
response = session.get('https://www.google.com')
print(response.http_version) # '2.0'
# Per-request HTTP/2 override
client = httpmorph.Client(http2=False) # Default disabled
response = client.get('https://www.google.com', http2=True) # Enable for this request
```
### Custom Headers
```python
headers = {
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer token123'
}
response = httpmorph.get('https://api.example.com', headers=headers)
```
### File Uploads
```python
files = {'file': ('report.pdf', open('report.pdf', 'rb'))}
response = httpmorph.post('https://httpbin.org/post', files=files)
```
### Timeout Control
```python
# Single timeout value
response = httpmorph.get('https://example.com', timeout=5)
# Separate connect and read timeouts
response = httpmorph.get('https://example.com', timeout=(3, 10))
```
### SSL Verification
```python
# Disable SSL verification (not recommended for production)
response = httpmorph.get('https://example.com', verify_ssl=False)
```
### Authentication
```python
# Basic authentication
response = httpmorph.get(
'https://api.example.com',
auth=('username', 'password')
)
```
### Redirects
```python
# Follow redirects (default behavior)
response = httpmorph.get('https://example.com/redirect')
# Don't follow redirects
response = httpmorph.get(
'https://example.com/redirect',
allow_redirects=False
)
# Check redirect history
print(len(response.history)) # Number of redirects
```
### Sessions with Cookies
```python
session = httpmorph.Session()
# Cookies persist across requests
session.get('https://example.com/login')
session.post('https://example.com/form', data={'key': 'value'})
# Access cookies
print(session.cookies)
```
## API Compatibility
httpmorph aims for high compatibility with Python's `requests` library:
| Feature | Status |
|---------|--------|
| GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS | Supported |
| JSON request/response | Supported |
| Form data & file uploads | Supported |
| Custom headers | Supported |
| Authentication | Supported |
| Cookies & sessions | Supported |
| Redirects with history | Supported |
| Timeout control | Supported |
| SSL verification | Supported |
| Streaming responses | Supported |
| Exception hierarchy | Supported |
## Response Object
```python
response = httpmorph.get('https://httpbin.org/get')
# Status and headers
print(response.status_code) # 200
print(response.ok) # True
print(response.reason) # 'OK'
print(response.headers) # {'Content-Type': 'application/json', ...}
# Response body
print(response.text) # Response as string
print(response.body) # Response as bytes
print(response.json()) # Parse JSON response
# Request info
print(response.url) # Final URL after redirects
print(response.history) # List of redirect responses
# Timing
print(response.elapsed) # Response time
print(response.total_time_us) # Total time in microseconds
# TLS info
print(response.tls_version) # TLS version used
print(response.tls_cipher) # Cipher suite
print(response.ja3_fingerprint) # JA3 fingerprint
```
## Exception Handling
```python
import httpmorph
try:
response = httpmorph.get('https://example.com', timeout=5)
response.raise_for_status() # Raise exception for 4xx/5xx
except httpmorph.Timeout:
print("Request timed out")
except httpmorph.ConnectionError:
print("Failed to connect")
except httpmorph.HTTPError as e:
print(f"HTTP error: {e.response.status_code}")
except httpmorph.RequestException as e:
print(f"Request failed: {e}")
```
## Platform Support
| Platform | Status |
|----------|--------|
| Windows | ✅ Fully supported |
| macOS (Intel & Apple Silicon) | ✅ Fully supported |
| Linux (x86_64, ARM64) | ✅ Fully supported |
All platforms use **BoringSSL** (Google's fork of OpenSSL) for consistent TLS behavior and advanced fingerprinting capabilities.
## Building from Source
httpmorph uses **BoringSSL** (built from source) on all platforms for consistent TLS fingerprinting.
### Prerequisites
**Windows:**
```bash
# Install build tools
choco install cmake golang nasm visualstudio2022buildtools -y
# Or install manually:
# - Visual Studio 2019+ (with C++ tools)
# - CMake 3.15+
# - Go 1.18+
# - NASM (for BoringSSL assembly optimizations)
```
**macOS:**
```bash
# Install dependencies
brew install cmake ninja libnghttp2
```
**Linux:**
```bash
# Ubuntu/Debian
sudo apt-get install cmake ninja-build libssl-dev pkg-config autoconf automake libtool
# Fedora/RHEL
sudo dnf install cmake ninja-build openssl-devel pkg-config autoconf automake libtool
```
### Build Steps
```bash
# 1. Clone the repository
git clone https://github.com/arman-bd/httpmorph.git
cd httpmorph
# 2. Build vendor dependencies (BoringSSL, nghttp2, zlib)
./scripts/setup_vendors.sh # On Windows: bash scripts/setup_vendors.sh
# 3. Build Python extensions
python setup.py build_ext --inplace
# 4. Install in development mode
pip install -e ".[dev]"
```
**Note:** The first build takes 5-10 minutes as it compiles BoringSSL from source. Subsequent builds are much faster (~30 seconds) as the vendor libraries are cached.
## Development
```bash
# Clone and setup (includes building BoringSSL)
git clone https://github.com/arman-bd/httpmorph.git
cd httpmorph
./scripts/setup_vendors.sh
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=httpmorph --cov-report=html
# Run specific test markers
pytest tests/ -m "not slow" # Skip slow tests
pytest tests/ -m "not proxy" # Skip proxy tests (default in CI)
pytest tests/ -m proxy # Only proxy tests
pytest tests/ -m integration # Only integration tests
pytest tests/ -m fingerprint # Only fingerprinting tests
```
## Architecture
httpmorph combines the best of both worlds:
- **C Core**: Low-level HTTP/TLS implementation for maximum performance
- **Python Wrapper**: Clean, Pythonic API with requests compatibility
- **BoringSSL**: Google's fork of OpenSSL, optimized and battle-tested
- **nghttp2**: Standard-compliant HTTP/2 implementation
The library uses Cython to bridge Python and C, providing near-native performance with the ease of Python.
## Contributing
Contributions are welcome! Areas where help is especially appreciated:
- Windows compatibility
- Additional browser profiles
- Performance optimizations
- Documentation improvements
- Bug reports and fixes
Please open an issue or pull request on GitHub.
## Testing
httpmorph has a comprehensive test suite with 270+ tests covering:
- All HTTP methods and parameters
- Redirect handling and history
- Cookie and session management
- Authentication and SSL
- Error handling and timeouts
- Unicode and encoding edge cases
- Thread safety and memory management
- Real-world integration tests
Run the test suite:
```bash
pytest tests/ -v
```
## Acknowledgments
- Built on BoringSSL (Google)
- HTTP/2 support via nghttp2
- Inspired by Python's requests and httpx libraries
- Browser fingerprints based on real browser implementations ( still in progress )
## FAQ
**Q: Why another HTTP client?**
A: httpmorph combines the performance of native C with browser fingerprinting capabilities, making it ideal for applications that need both speed and realistic browser behavior.
**Q: Is it production-ready?**
A: No, httpmorph is still in active development and not yet recommended for production use.
**Q: Can I use this as a drop-in replacement for requests?**
A: For most common use cases, yes! We've implemented the most widely-used requests API. Some advanced features may have slight differences.
**Q: How do I report a bug?**
A: Please open an issue on GitHub with a minimal reproduction example and your environment details (OS, Python version, httpmorph version).
## Support
- GitHub Issues: [Report bugs and feature requests](https://github.com/arman-bd/httpmorph/issues)
- Documentation: [Full API documentation](https://httpmorph.readthedocs.io)
- PyPI: [httpmorph on PyPI](https://pypi.org/project/httpmorph/)
---
**httpmorph** - Fast, compatible, and powerful HTTP for Python.
Raw data
{
"_id": null,
"home_page": null,
"name": "httpmorph",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "http, https, client, performance, anti-fingerprint, tls, ja3, http2",
"author": null,
"author_email": "Arman Hossain <arman@bytetunnels.com>",
"download_url": null,
"platform": null,
"description": "# httpmorph\n\n [](https://codecov.io/gh/arman-bd/httpmorph) [](https://pypi.org/project/httpmorph/) [](LICENSE)\n\nA Python HTTP client focused on mimicking browser fingerprints.\n\n**\u26a0\ufe0f Work in Progress** - This library is in early development. Features and API may change.\n\n## Features\n\n- **Requests-compatible API** - Drop-in replacement for most Python `requests` use cases\n- **High Performance** - Native C implementation with BoringSSL for HTTP/HTTPS\n- **HTTP/2 Support** - Full HTTP/2 with ALPN negotiation via nghttp2 (httpx-like API)\n- **Browser Fingerprinting** - Realistic browser profiles (Chrome and it's variants)\n- **TLS Fingerprinting** - JA3 fingerprint generation and customization\n- **Connection Pooling** - Automatic connection reuse for better performance\n- **Session Management** - Persistent cookies and headers across requests\n\n## Installation\n\n```bash\npip install httpmorph\n```\n\n### Requirements\n\n- Python 3.8+\n- Windows, macOS, or Linux\n- BoringSSL (built automatically from source)\n- libnghttp2 (for HTTP/2)\n\n## Quick Start\n\n```python\nimport httpmorph\n\n# Simple GET request\nresponse = httpmorph.get('https://icanhazip.com')\nprint(response.status_code)\nprint(response.text)\n\n# POST with JSON\nresponse = httpmorph.post(\n 'https://httpbin.org/post',\n json={'key': 'value'}\n)\n\n# Using sessions\nsession = httpmorph.Session(browser='chrome')\nresponse = session.get('https://example.com')\n\n# HTTP/2 support (httpx-like API)\nclient = httpmorph.Client(http2=True)\nresponse = client.get('https://www.google.com')\nprint(response.http_version) # '2.0'\n```\n\n## Browser Profiles\n\nMimic real browser behavior with pre-configured profiles:\n\n```python\n# Use Chrome fingerprint\nresponse = httpmorph.get('https://example.com', browser='chrome')\n\n# Use Firefox fingerprint\nsession = httpmorph.Session(browser='firefox')\nresponse = session.get('https://example.com')\n\n# Available browsers: chrome, firefox, safari, edge\n```\n\n## Advanced Usage\n\n### HTTP/2 Support\n\nhttpmorph supports HTTP/2 with an httpx-like API:\n\n```python\n# Enable HTTP/2 for a client (default is False)\nclient = httpmorph.Client(http2=True)\nresponse = client.get('https://www.google.com')\nprint(response.http_version) # '2.0'\n\n# Enable HTTP/2 for a session\nsession = httpmorph.Session(browser='chrome', http2=True)\nresponse = session.get('https://www.google.com')\nprint(response.http_version) # '2.0'\n\n# Per-request HTTP/2 override\nclient = httpmorph.Client(http2=False) # Default disabled\nresponse = client.get('https://www.google.com', http2=True) # Enable for this request\n```\n\n### Custom Headers\n\n```python\nheaders = {\n 'User-Agent': 'MyApp/1.0',\n 'Authorization': 'Bearer token123'\n}\nresponse = httpmorph.get('https://api.example.com', headers=headers)\n```\n\n### File Uploads\n\n```python\nfiles = {'file': ('report.pdf', open('report.pdf', 'rb'))}\nresponse = httpmorph.post('https://httpbin.org/post', files=files)\n```\n\n### Timeout Control\n\n```python\n# Single timeout value\nresponse = httpmorph.get('https://example.com', timeout=5)\n\n# Separate connect and read timeouts\nresponse = httpmorph.get('https://example.com', timeout=(3, 10))\n```\n\n### SSL Verification\n\n```python\n# Disable SSL verification (not recommended for production)\nresponse = httpmorph.get('https://example.com', verify_ssl=False)\n```\n\n### Authentication\n\n```python\n# Basic authentication\nresponse = httpmorph.get(\n 'https://api.example.com',\n auth=('username', 'password')\n)\n```\n\n### Redirects\n\n```python\n# Follow redirects (default behavior)\nresponse = httpmorph.get('https://example.com/redirect')\n\n# Don't follow redirects\nresponse = httpmorph.get(\n 'https://example.com/redirect',\n allow_redirects=False\n)\n\n# Check redirect history\nprint(len(response.history)) # Number of redirects\n```\n\n### Sessions with Cookies\n\n```python\nsession = httpmorph.Session()\n\n# Cookies persist across requests\nsession.get('https://example.com/login')\nsession.post('https://example.com/form', data={'key': 'value'})\n\n# Access cookies\nprint(session.cookies)\n```\n\n## API Compatibility\n\nhttpmorph aims for high compatibility with Python's `requests` library:\n\n| Feature | Status |\n|---------|--------|\n| GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS | Supported |\n| JSON request/response | Supported |\n| Form data & file uploads | Supported |\n| Custom headers | Supported |\n| Authentication | Supported |\n| Cookies & sessions | Supported |\n| Redirects with history | Supported |\n| Timeout control | Supported |\n| SSL verification | Supported |\n| Streaming responses | Supported |\n| Exception hierarchy | Supported |\n\n## Response Object\n\n```python\nresponse = httpmorph.get('https://httpbin.org/get')\n\n# Status and headers\nprint(response.status_code) # 200\nprint(response.ok) # True\nprint(response.reason) # 'OK'\nprint(response.headers) # {'Content-Type': 'application/json', ...}\n\n# Response body\nprint(response.text) # Response as string\nprint(response.body) # Response as bytes\nprint(response.json()) # Parse JSON response\n\n# Request info\nprint(response.url) # Final URL after redirects\nprint(response.history) # List of redirect responses\n\n# Timing\nprint(response.elapsed) # Response time\nprint(response.total_time_us) # Total time in microseconds\n\n# TLS info\nprint(response.tls_version) # TLS version used\nprint(response.tls_cipher) # Cipher suite\nprint(response.ja3_fingerprint) # JA3 fingerprint\n```\n\n## Exception Handling\n\n```python\nimport httpmorph\n\ntry:\n response = httpmorph.get('https://example.com', timeout=5)\n response.raise_for_status() # Raise exception for 4xx/5xx\nexcept httpmorph.Timeout:\n print(\"Request timed out\")\nexcept httpmorph.ConnectionError:\n print(\"Failed to connect\")\nexcept httpmorph.HTTPError as e:\n print(f\"HTTP error: {e.response.status_code}\")\nexcept httpmorph.RequestException as e:\n print(f\"Request failed: {e}\")\n```\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Windows | \u2705 Fully supported |\n| macOS (Intel & Apple Silicon) | \u2705 Fully supported |\n| Linux (x86_64, ARM64) | \u2705 Fully supported |\n\nAll platforms use **BoringSSL** (Google's fork of OpenSSL) for consistent TLS behavior and advanced fingerprinting capabilities.\n\n## Building from Source\n\nhttpmorph uses **BoringSSL** (built from source) on all platforms for consistent TLS fingerprinting.\n\n### Prerequisites\n\n**Windows:**\n```bash\n# Install build tools\nchoco install cmake golang nasm visualstudio2022buildtools -y\n\n# Or install manually:\n# - Visual Studio 2019+ (with C++ tools)\n# - CMake 3.15+\n# - Go 1.18+\n# - NASM (for BoringSSL assembly optimizations)\n```\n\n**macOS:**\n```bash\n# Install dependencies\nbrew install cmake ninja libnghttp2\n```\n\n**Linux:**\n```bash\n# Ubuntu/Debian\nsudo apt-get install cmake ninja-build libssl-dev pkg-config autoconf automake libtool\n\n# Fedora/RHEL\nsudo dnf install cmake ninja-build openssl-devel pkg-config autoconf automake libtool\n```\n\n### Build Steps\n\n```bash\n# 1. Clone the repository\ngit clone https://github.com/arman-bd/httpmorph.git\ncd httpmorph\n\n# 2. Build vendor dependencies (BoringSSL, nghttp2, zlib)\n./scripts/setup_vendors.sh # On Windows: bash scripts/setup_vendors.sh\n\n# 3. Build Python extensions\npython setup.py build_ext --inplace\n\n# 4. Install in development mode\npip install -e \".[dev]\"\n```\n\n**Note:** The first build takes 5-10 minutes as it compiles BoringSSL from source. Subsequent builds are much faster (~30 seconds) as the vendor libraries are cached.\n\n## Development\n\n```bash\n# Clone and setup (includes building BoringSSL)\ngit clone https://github.com/arman-bd/httpmorph.git\ncd httpmorph\n./scripts/setup_vendors.sh\n\n# Install development dependencies\npip install -e \".[dev]\"\n\n# Run tests\npytest tests/ -v\n\n# Run with coverage\npytest tests/ --cov=httpmorph --cov-report=html\n\n# Run specific test markers\npytest tests/ -m \"not slow\" # Skip slow tests\npytest tests/ -m \"not proxy\" # Skip proxy tests (default in CI)\npytest tests/ -m proxy # Only proxy tests\npytest tests/ -m integration # Only integration tests\npytest tests/ -m fingerprint # Only fingerprinting tests\n```\n\n## Architecture\n\nhttpmorph combines the best of both worlds:\n\n- **C Core**: Low-level HTTP/TLS implementation for maximum performance\n- **Python Wrapper**: Clean, Pythonic API with requests compatibility\n- **BoringSSL**: Google's fork of OpenSSL, optimized and battle-tested\n- **nghttp2**: Standard-compliant HTTP/2 implementation\n\nThe library uses Cython to bridge Python and C, providing near-native performance with the ease of Python.\n\n## Contributing\n\nContributions are welcome! Areas where help is especially appreciated:\n\n- Windows compatibility\n- Additional browser profiles\n- Performance optimizations\n- Documentation improvements\n- Bug reports and fixes\n\nPlease open an issue or pull request on GitHub.\n\n## Testing\n\nhttpmorph has a comprehensive test suite with 270+ tests covering:\n\n- All HTTP methods and parameters\n- Redirect handling and history\n- Cookie and session management\n- Authentication and SSL\n- Error handling and timeouts\n- Unicode and encoding edge cases\n- Thread safety and memory management\n- Real-world integration tests\n\nRun the test suite:\n\n```bash\npytest tests/ -v\n```\n\n## Acknowledgments\n\n- Built on BoringSSL (Google)\n- HTTP/2 support via nghttp2\n- Inspired by Python's requests and httpx libraries\n- Browser fingerprints based on real browser implementations ( still in progress )\n\n## FAQ\n\n**Q: Why another HTTP client?**\nA: httpmorph combines the performance of native C with browser fingerprinting capabilities, making it ideal for applications that need both speed and realistic browser behavior.\n\n**Q: Is it production-ready?**\nA: No, httpmorph is still in active development and not yet recommended for production use.\n\n**Q: Can I use this as a drop-in replacement for requests?**\nA: For most common use cases, yes! We've implemented the most widely-used requests API. Some advanced features may have slight differences.\n\n**Q: How do I report a bug?**\nA: Please open an issue on GitHub with a minimal reproduction example and your environment details (OS, Python version, httpmorph version).\n\n## Support\n\n- GitHub Issues: [Report bugs and feature requests](https://github.com/arman-bd/httpmorph/issues)\n- Documentation: [Full API documentation](https://httpmorph.readthedocs.io)\n- PyPI: [httpmorph on PyPI](https://pypi.org/project/httpmorph/)\n\n---\n\n**httpmorph** - Fast, compatible, and powerful HTTP for Python.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A Python HTTP client focused on mimicking browser fingerprints.",
"version": "0.2.3",
"project_urls": {
"Documentation": "https://github.com/arman-bd/httpmorph/blob/main/README.md",
"Homepage": "https://github.com/arman-bd/httpmorph",
"Issues": "https://github.com/arman-bd/httpmorph/issues",
"Repository": "https://github.com/arman-bd/httpmorph"
},
"split_keywords": [
"http",
" https",
" client",
" performance",
" anti-fingerprint",
" tls",
" ja3",
" http2"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ecb0f871eb2a72a9c77e475ed3e5b2aba1b0d4d356e694ef8b8276e87205e433",
"md5": "78f8ff9f790cd88161822fb6db0d9edc",
"sha256": "695b455d2968bf37c8db2ccb0aee14fe69417512d6d156dcc0af383b70fde57c"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "78f8ff9f790cd88161822fb6db0d9edc",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 2139881,
"upload_time": "2025-11-06T01:47:43",
"upload_time_iso_8601": "2025-11-06T01:47:43.196316Z",
"url": "https://files.pythonhosted.org/packages/ec/b0/f871eb2a72a9c77e475ed3e5b2aba1b0d4d356e694ef8b8276e87205e433/httpmorph-0.2.3-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a035572acba416922fb39af34fd623e4290676de32c2d2eb316ba807781f16ed",
"md5": "2edffef1387f5ac7b7c58c056fd5a1ae",
"sha256": "76387d248defecc5640d742188379ed80579ca6bf0bbdae6d0bf4ecc38154ac0"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "2edffef1387f5ac7b7c58c056fd5a1ae",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 19379884,
"upload_time": "2025-11-06T01:47:45",
"upload_time_iso_8601": "2025-11-06T01:47:45.251656Z",
"url": "https://files.pythonhosted.org/packages/a0/35/572acba416922fb39af34fd623e4290676de32c2d2eb316ba807781f16ed/httpmorph-0.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a212824ead62983ffa7d55b7f20380fefb64baf3b5ea89eab66ba1f65f1af873",
"md5": "64b02b998082c398f6d9b04708d283c6",
"sha256": "71dc8d24477bb88b076459b9068415d38ff6557ca19b663ff076e76174bb0c1e"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "64b02b998082c398f6d9b04708d283c6",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1598788,
"upload_time": "2025-11-06T01:47:47",
"upload_time_iso_8601": "2025-11-06T01:47:47.187699Z",
"url": "https://files.pythonhosted.org/packages/a2/12/824ead62983ffa7d55b7f20380fefb64baf3b5ea89eab66ba1f65f1af873/httpmorph-0.2.3-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "01099297ecb0ffc84d1ee46af7fd8d02dd4fdae42c9cffbee7e6a033bd8e8de3",
"md5": "15117173846865d29872aae48ab8a46c",
"sha256": "a450997981ad461ae1f749bebce65906028935550766c047ea13fc73a08077b0"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "15117173846865d29872aae48ab8a46c",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 2139341,
"upload_time": "2025-11-06T01:47:48",
"upload_time_iso_8601": "2025-11-06T01:47:48.388287Z",
"url": "https://files.pythonhosted.org/packages/01/09/9297ecb0ffc84d1ee46af7fd8d02dd4fdae42c9cffbee7e6a033bd8e8de3/httpmorph-0.2.3-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d60f54afff3e75baaf153f25a3d934e26f6331d868424e64d306d72b2368f710",
"md5": "6646bd3bd65a32f58893b6b0d119a8cf",
"sha256": "72dee4c167dc9a8e0eeed303b4dd9f280e761644ac6048e3e57c8af6790f6bde"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "6646bd3bd65a32f58893b6b0d119a8cf",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 19427787,
"upload_time": "2025-11-06T01:47:49",
"upload_time_iso_8601": "2025-11-06T01:47:49.671622Z",
"url": "https://files.pythonhosted.org/packages/d6/0f/54afff3e75baaf153f25a3d934e26f6331d868424e64d306d72b2368f710/httpmorph-0.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ff28885931fb55e02867eaa45b19389ac15a3231c9575be094897ae0cfe2cf01",
"md5": "e399e169c08c3b451ba4b028b51b20a2",
"sha256": "b7bcb67722475fe63f67aee5105916c4d87ed233639cc8981885ee1ea6b62a76"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "e399e169c08c3b451ba4b028b51b20a2",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1598964,
"upload_time": "2025-11-06T01:47:51",
"upload_time_iso_8601": "2025-11-06T01:47:51.938531Z",
"url": "https://files.pythonhosted.org/packages/ff/28/885931fb55e02867eaa45b19389ac15a3231c9575be094897ae0cfe2cf01/httpmorph-0.2.3-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3917559c3af7acfba8c84c055095c6e34c685790b540abed9783a0416d47cc11",
"md5": "1adb15496303d9e21af2f1575bf0a4d6",
"sha256": "9bb5ddcdad77a0e214d8cbb961469f942f1f0121cd3fcae8bba4b408907e3a6c"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "1adb15496303d9e21af2f1575bf0a4d6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 2139904,
"upload_time": "2025-11-06T01:47:53",
"upload_time_iso_8601": "2025-11-06T01:47:53.375525Z",
"url": "https://files.pythonhosted.org/packages/39/17/559c3af7acfba8c84c055095c6e34c685790b540abed9783a0416d47cc11/httpmorph-0.2.3-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "da7ab977554268511181c87b4e57bd951d1a5ec2c939d75b20d4f5f6905a2f7f",
"md5": "561bbf5a318586173f37cf8aa8c5fa43",
"sha256": "d53a3a851fadca2f0c135ceb92903048f379352083b7f2828f7c4d97b035d283"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "561bbf5a318586173f37cf8aa8c5fa43",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 19416875,
"upload_time": "2025-11-06T01:47:54",
"upload_time_iso_8601": "2025-11-06T01:47:54.922844Z",
"url": "https://files.pythonhosted.org/packages/da/7a/b977554268511181c87b4e57bd951d1a5ec2c939d75b20d4f5f6905a2f7f/httpmorph-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "601217c1e381eb45de6b3dde8b29bab35f2f0382eef42865bac89409522c74d3",
"md5": "31596ddbda5983db6a9a7e42f9a0fcac",
"sha256": "b0c82c388f705788d0b0153d45e0f3fbf99d29dec631a131fe32e93efc665495"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "31596ddbda5983db6a9a7e42f9a0fcac",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1599122,
"upload_time": "2025-11-06T01:47:56",
"upload_time_iso_8601": "2025-11-06T01:47:56.775219Z",
"url": "https://files.pythonhosted.org/packages/60/12/17c1e381eb45de6b3dde8b29bab35f2f0382eef42865bac89409522c74d3/httpmorph-0.2.3-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7516c82cc645aabc57211ff864d9fd3f15d757465b61983ce9a4b86eda729877",
"md5": "a4356c7bf180b31c5c658c957bacc43f",
"sha256": "652844c47b304823d639f6d167518b2c212d719b700c98ca3244cbd37e7766ca"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "a4356c7bf180b31c5c658c957bacc43f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 2138279,
"upload_time": "2025-11-06T01:47:58",
"upload_time_iso_8601": "2025-11-06T01:47:58.200069Z",
"url": "https://files.pythonhosted.org/packages/75/16/c82cc645aabc57211ff864d9fd3f15d757465b61983ce9a4b86eda729877/httpmorph-0.2.3-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "463348db641e599d7cca50d5c4111e1d5a75bd8b64329e0f124618e54e2c4a6c",
"md5": "b5fa570e889f57abb263f6a25bd2227c",
"sha256": "1ec608e7f39da48414e7cb3df368ef32ba617285581a75041b7fb5ec229011f7"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b5fa570e889f57abb263f6a25bd2227c",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 19407552,
"upload_time": "2025-11-06T01:47:59",
"upload_time_iso_8601": "2025-11-06T01:47:59.574269Z",
"url": "https://files.pythonhosted.org/packages/46/33/48db641e599d7cca50d5c4111e1d5a75bd8b64329e0f124618e54e2c4a6c/httpmorph-0.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cdecda83ddeee243e27d60d8c3b88a151a8d436c7a6d0fd7639cc977ffb37676",
"md5": "834b6d787a9c7288973c1ca772c02f23",
"sha256": "1bb049bb6c80c0e66eca9382a9793c32c8553391c64b93ac4967d55a14744c93"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "834b6d787a9c7288973c1ca772c02f23",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1599115,
"upload_time": "2025-11-06T01:48:01",
"upload_time_iso_8601": "2025-11-06T01:48:01.725329Z",
"url": "https://files.pythonhosted.org/packages/cd/ec/da83ddeee243e27d60d8c3b88a151a8d436c7a6d0fd7639cc977ffb37676/httpmorph-0.2.3-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1ca4ee0d1a308f6ed495958e6782612115f86b75922bed09ad92c7e7e9f12710",
"md5": "5293421e6c26c83dfb6677a34d27e8b4",
"sha256": "efc801efc5651ae9cf7ec18b808dd347eb9898a3846f35f7d6d388d357edd590"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "5293421e6c26c83dfb6677a34d27e8b4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 2147309,
"upload_time": "2025-11-06T01:48:02",
"upload_time_iso_8601": "2025-11-06T01:48:02.828295Z",
"url": "https://files.pythonhosted.org/packages/1c/a4/ee0d1a308f6ed495958e6782612115f86b75922bed09ad92c7e7e9f12710/httpmorph-0.2.3-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6dd9185a43b7bbf8f23d61ed89b8144d765466619f7fc4f2a758ad2799a1eb2c",
"md5": "3f745b24ab8c9aca9f5245a2c001b19c",
"sha256": "2709563f2349e7850de2ba866b71834af53380d70bc2d71b15259f13dd5d53e2"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "3f745b24ab8c9aca9f5245a2c001b19c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 19421746,
"upload_time": "2025-11-06T01:48:04",
"upload_time_iso_8601": "2025-11-06T01:48:04.011934Z",
"url": "https://files.pythonhosted.org/packages/6d/d9/185a43b7bbf8f23d61ed89b8144d765466619f7fc4f2a758ad2799a1eb2c/httpmorph-0.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f25e1bcdddd9785cc7fa55b36e6ed8ad3a4cbff174d08145666e15718844cc0e",
"md5": "263d67fac7557a06ecb0ab8bec1a1774",
"sha256": "e9eda94199e3abcebcadcf78572e4f81e0593d4b1819b60b17bff33dd594f80a"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "263d67fac7557a06ecb0ab8bec1a1774",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1602191,
"upload_time": "2025-11-06T01:48:05",
"upload_time_iso_8601": "2025-11-06T01:48:05.785461Z",
"url": "https://files.pythonhosted.org/packages/f2/5e/1bcdddd9785cc7fa55b36e6ed8ad3a4cbff174d08145666e15718844cc0e/httpmorph-0.2.3-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f3b1c0cb18a77d577a64169b6e03e571366e1c523b0d5421050fd71c7972ba74",
"md5": "22dfff5c52b11adea9538e521373dec4",
"sha256": "faee748ecacbf2b3bb8e4849c1ac259ecb7c4f15b57097693cccdb7a8c5c74ca"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "22dfff5c52b11adea9538e521373dec4",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 2140761,
"upload_time": "2025-11-06T01:48:06",
"upload_time_iso_8601": "2025-11-06T01:48:06.842802Z",
"url": "https://files.pythonhosted.org/packages/f3/b1/c0cb18a77d577a64169b6e03e571366e1c523b0d5421050fd71c7972ba74/httpmorph-0.2.3-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6a8a522a1ec2c5522b74753ea408821d0d1c2d3388de6047882c7567ba00bac2",
"md5": "b44e6354eea8b35eeabbfc030b79113a",
"sha256": "4f1d33c15d669cd640df313fa8f7d539a9f357695fa279912a5f92e43fcf9ad7"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b44e6354eea8b35eeabbfc030b79113a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 19375625,
"upload_time": "2025-11-06T01:48:08",
"upload_time_iso_8601": "2025-11-06T01:48:08.374510Z",
"url": "https://files.pythonhosted.org/packages/6a/8a/522a1ec2c5522b74753ea408821d0d1c2d3388de6047882c7567ba00bac2/httpmorph-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e13bbff395c118b56692f8ee011bdc6efb4ec4499574fcbc74dbcccddc3ba337",
"md5": "f22ef78413aa24b9e9dda68d3c2e3208",
"sha256": "e48100aba744a33d9d606db16ace143714f0b65959236387bcacd3689a7ca0e3"
},
"downloads": -1,
"filename": "httpmorph-0.2.3-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "f22ef78413aa24b9e9dda68d3c2e3208",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1599615,
"upload_time": "2025-11-06T01:48:10",
"upload_time_iso_8601": "2025-11-06T01:48:10.287063Z",
"url": "https://files.pythonhosted.org/packages/e1/3b/bff395c118b56692f8ee011bdc6efb4ec4499574fcbc74dbcccddc3ba337/httpmorph-0.2.3-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-06 01:47:43",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "arman-bd",
"github_project": "httpmorph",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "httpmorph"
}