{"id":30349681,"url":"https://github.com/aprilahijriyan/fast-multipart","last_synced_at":"2025-08-18T20:08:25.654Z","repository":{"id":306311665,"uuid":"1024430346","full_name":"aprilahijriyan/fast-multipart","owner":"aprilahijriyan","description":"⚡Lightning-fast multipart parsing for Python","archived":false,"fork":false,"pushed_at":"2025-07-24T20:33:20.000Z","size":21,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-17T19:59:16.270Z","etag":null,"topics":["multipart-formdata","pyo3","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aprilahijriyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-22T17:26:10.000Z","updated_at":"2025-07-25T01:15:52.000Z","dependencies_parsed_at":"2025-07-25T00:21:07.759Z","dependency_job_id":"66ae8218-fb8d-44e7-acf9-21817fd41a4d","html_url":"https://github.com/aprilahijriyan/fast-multipart","commit_stats":null,"previous_names":["aprilahijriyan/fast-multipart"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/aprilahijriyan/fast-multipart","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Ffast-multipart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Ffast-multipart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Ffast-multipart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Ffast-multipart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aprilahijriyan","download_url":"https://codeload.github.com/aprilahijriyan/fast-multipart/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Ffast-multipart/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271053844,"owners_count":24691198,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["multipart-formdata","pyo3","python"],"created_at":"2025-08-18T20:08:25.054Z","updated_at":"2025-08-18T20:08:25.642Z","avatar_url":"https://github.com/aprilahijriyan.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fast-multipart ⚡\n\n\u003e **Lightning-fast multipart parsing for Python** - An enhanced successor to `pymulter`\n\n## 🚀 Performance\n\n`fast-multipart` significantly outperforms the standard `multipart` library across all file sizes:\n\n| File Size         | Library        | Avg Time | Avg Throughput | Performance Gain |\n| ----------------- | -------------- | -------- | -------------- | ---------------- |\n| **Small (413 B)** | fast-multipart | 0.0006s  | 623.1 KB/s     | **4.1x faster**  |\n|                   | multipart      | 0.0026s  | 152.6 KB/s     |                  |\n| **Medium (8 MB)** | fast-multipart | 0.0055s  | 1.4 GB/s       | **3.0x faster**  |\n|                   | multipart      | 0.0165s  | 483.6 MB/s     |                  |\n| **Large (80 MB)** | fast-multipart | 0.0433s  | 1.8 GB/s       | **2.4x faster**  |\n|                   | multipart      | 0.1039s  | 770.2 MB/s     |                  |\n| **XL (200 MB)**   | fast-multipart | 0.0956s  | 2.0 GB/s       | **2.6x faster**  |\n|                   | multipart      | 0.2463s  | 812.0 MB/s     |                  |\n| **2XL (1000 MB)** | fast-multipart | 0.4324s  | 2.3 GB/s       | **2.9x faster**  |\n|                   | multipart      | 1.2743s  | 784.8 MB/s     |                  |\n\n## ✨ Key Features\n\n- **Up to 4.1x Faster**: Significant performance gains over pure Python parsers\n- **Streaming Parser**: Process large files chunk-by-chunk\n- **Callback-Based**: Handle fields and data as they arrive\n- **Type-Safe**: Full type hints support for better development experience\n\n## 📦 Installation\n\n```bash\n# Recommended: using uv\nuv add fast-multipart\n\n# Or with pip\npip install fast-multipart\n```\n\n## 🎯 Quick Start\n\n```python\nfrom fast_multipart import MultipartParser, FieldPart\n\ndef on_field(field: FieldPart) -\u003e None:\n    print(f\"Field: {field.name}\")\n    if field.filename:\n        print(f\"Filename: {field.filename}\")\n    print(f\"Content-Type: {field.content_type}\")\n\ndef on_field_data(data: bytes) -\u003e None:\n    # Process chunk of field data\n    print(f\"Received {len(data)} bytes\")\n\ndef on_field_end() -\u003e None:\n    print(\"Field completed\")\n\n# Create parser with boundary from Content-Type header\nboundary = \"----WebKitFormBoundary7MA4YWxkTrZu0gW\"\nparser = MultipartParser(\n    boundary=boundary,\n    on_field=on_field,\n    on_field_data=on_field_data,\n    on_field_end=on_field_end\n)\n\n# Feed data to parser\nwith open('multipart_data.bin', 'rb') as f:\n    while chunk := f.read(8192):\n        parser.feed(chunk)\n\nparser.close()\n```\n\nFor more info, feel free to check out the [tests](tests/test_parser.py) file.\n\n## 🔧 API Reference\n\n### `MultipartParser`\n\nThe core streaming parser for multipart data.\n\n```python\nMultipartParser(\n    boundary: str,                              # Boundary string from Content-Type\n    on_field: Callable[[FieldPart], Any],      # Called when new field starts\n    on_field_data: Callable[[bytes], Any],     # Called for each data chunk\n    on_field_end: Callable[[], Any],           # Called when field ends\n    buffer_cap: Optional[int] = 8912           # Internal buffer size\n)\n```\n\n### `FieldPart`\n\nContains metadata for each multipart field.\n\n```python\nclass FieldPart:\n    name: str                           # Field name\n    filename: Optional[str]             # Original filename (if file upload)\n    content_type: Optional[str]         # MIME type\n    headers: dict[str, str]            # All field headers\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faprilahijriyan%2Ffast-multipart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faprilahijriyan%2Ffast-multipart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faprilahijriyan%2Ffast-multipart/lists"}