anyrfc


Nameanyrfc JSON
Version 0.3.1 PyPI version JSON
download
home_pageNone
SummaryComplete, RFC-compliant protocol clients using AnyIO structured concurrency
upload_time2025-08-18 02:50:26
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords anyio async client imap protocol rfc rfc5321 rfc6455 rfc9051 smtp structured-concurrency websocket
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # AnyRFC

> **Complete, RFC-compliant protocol clients built with AnyIO structured concurrency**

[![PyPI version](https://badge.fury.io/py/anyrfc.svg)](https://badge.fury.io/py/anyrfc)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

AnyRFC provides **RFC-compliant protocol clients** that prioritize correctness, security, and modern
async patterns. Built exclusively with [AnyIO](https://anyio.readthedocs.io/) for structured concurrency.

## Why AnyRFC?

๐ŸŽฏ **RFC Compliance First** - Every implementation passes comprehensive RFC test suites  
โšก **Modern Async** - Structured concurrency with AnyIO (no asyncio dependency hell)  
๐Ÿ”’ **Security by Default** - TLS everywhere, proper certificate validation, secure authentication  
๐Ÿงช **Battle-Tested** - Real-world interoperability testing against major servers  
๐Ÿ“ **Type Safe** - Full mypy compliance with strict typing  
๐Ÿš€ **Complete** - Full implementations, not toys or demos  

## Quick Start

```bash
pip install anyrfc
```

```python
import anyio
from anyrfc import WebSocketClient

async def main():
    async with WebSocketClient("wss://echo.websocket.org/") as ws:
        await ws.send_text("Hello, AnyRFC!")
        async for message in ws.receive():
            print(f"Received: {message}")
            break  # Just get the first message

anyio.run(main)
```

## What's Included

### ๐ŸŒ WebSocket Client (RFC 6455)

Complete WebSocket implementation with all RFC 6455 features:

```python
from anyrfc import WebSocketClient, CloseCode

async with WebSocketClient("wss://api.example.com/ws") as ws:
    # Send different message types
    await ws.send_text("Hello!")
    await ws.send_binary(b"\\x00\\x01\\x02\\x03")

    # Handle incoming messages
    async for message in ws.receive():
        if isinstance(message, str):
            print(f"Text: {message}")
        else:
            print(f"Binary: {message.hex()}")

        if should_close:
            await ws.close(CloseCode.NORMAL_CLOSURE)
            break
```

**Features:**

- โœ… All frame types (text, binary, ping, pong, close)
- โœ… Message fragmentation and reassembly
- โœ… Proper client-side frame masking
- โœ… Extension support framework
- โœ… Graceful connection handling
- โœ… Real-server compatibility

### ๐Ÿ“ง Email Clients (IMAP & SMTP)

Battle-tested email clients with full RFC compliance and real-world Gmail compatibility:

```python
from anyrfc import IMAPClient, SMTPClient

# IMAP - Complete email operations
async with IMAPClient("imap.gmail.com", use_tls=True) as imap:
    await imap.authenticate({"username": "user", "password": "app_password"})
    await imap.select_mailbox("INBOX")

    # Search and read emails
    messages = await imap.search_messages("UNSEEN")
    for msg_id in messages[:5]:
        email = await imap.fetch_messages(str(msg_id), "BODY[]")
        
        # Mark as read
        await imap.store_message_flags(str(msg_id), [b"\\Seen"], "FLAGS")

    # Create drafts with proper literal continuation
    await imap.append_message("Drafts", email_content, [b"\\Draft"])

    # Extract attachments as binary BLOBs
    bodystructure = await imap.fetch_messages(str(msg_id), "BODYSTRUCTURE")
    # Parse structure and fetch binary parts...

# SMTP - Send emails with authentication
async with SMTPClient("smtp.gmail.com", use_starttls=True) as smtp:
    await smtp.authenticate({"username": "user", "password": "app_password"})
    await smtp.send_message(
        from_addr="sender@example.com",
        to_addrs=["recipient@example.com"],
        message="""Subject: Hello from AnyRFC!

This email was sent using AnyRFC's SMTP client!
"""
    )
```

**IMAP Features (RFC 9051 Compliant):**

- โœ… **Complete email operations**: Read, flag, search, delete
- โœ… **Draft creation**: APPEND with proper literal continuation
- โœ… **Real-time monitoring**: Live email detection with polling
- โœ… **Attachment extraction**: Binary BLOB downloads (PDFs, images, etc.)
- โœ… **Gmail compatibility**: Tested with live Gmail IMAP servers
- โœ… **Extension support**: IDLE, SORT, THREAD, CONDSTORE, QRESYNC
- โœ… **Battle-tested**: Handles 178KB+ attachments and complex operations

## Architecture Highlights

### AnyIO Structured Concurrency

Every I/O operation uses AnyIO's structured concurrency primitives:

```python
async def websocket_with_timeout():
    async with anyio.create_task_group() as tg:
        # Connection with automatic cleanup
        tg.start_soon(websocket_handler)

        # Heartbeat with cancellation scope
        with anyio.move_on_after(30):
            tg.start_soon(heartbeat_sender)
```

### RFC Compliance Testing

```python
from anyrfc.websocket import WebSocketClient

client = WebSocketClient("wss://example.com")
compliance_report = await client.validate_compliance()

# Returns detailed RFC 6455 test results
assert compliance_report["handshake_validation"] == True
assert compliance_report["frame_parsing"] == True
assert compliance_report["close_sequence"] == True
```

### Type Safety

```python
from anyrfc import WebSocketClient
from anyrfc.websocket import WSFrame, OpCode

# Fully typed interfaces
client: WebSocketClient = WebSocketClient("wss://api.example.com")
frame: WSFrame = WSFrame(fin=True, opcode=OpCode.TEXT, payload=b"test")

# MyPy validates everything
reveal_type(client.websocket_state)  # WSState
reveal_type(await client.receive())  # Union[str, bytes]
```

## Installation & Setup

### Basic Installation

```bash
pip install anyrfc
```

### Development Setup

```bash
git clone https://github.com/elgertam/anyrfc.git
cd anyrfc

# Install with uv (recommended)
uv sync --all-extras

# Or with pip
pip install -e ".[dev]"
```

### Requirements

- **Python**: 3.11+
- **Core**: `anyio>=4.0.0`
- **HTTP**: `httpx>=0.25.0` (approved dependency)
- **Types**: `typing-extensions>=4.0.0`

## Real-World Examples

### WebSocket Trading Client

```python
from anyrfc import WebSocketClient
import json

async def crypto_prices():
    # Binance public data stream (no authentication required)
    uri = "wss://data-stream.binance.vision/ws/btcusdt@ticker"

    # Use relaxed validation for real-world servers
    async with WebSocketClient(uri, strict_rfc_validation=False) as ws:
        async for message in ws.receive():
            data = json.loads(message)
            if 'c' in data:  # Current price
                price = float(data['c'])
                change = float(data['P'])  # 24hr change %
                print(f"๐Ÿ’ฐ BTC-USDT: ${price:,.2f} ({change:+.2f}%)")
```

### Email Monitoring Service

```python
from anyrfc import IMAPClient
import anyio
import re

async def email_monitor():
    """Real-time email monitoring with secret code extraction."""
    async with IMAPClient("imap.gmail.com", use_tls=True) as imap:
        await imap.authenticate({"username": "user", "password": "app_password"})
        await imap.select_mailbox("INBOX")

        while True:
            # Check for new emails every 5 seconds (production-tested)
            unread = await imap.search_messages("UNSEEN")
            if unread:
                print(f"๐Ÿ“ง {len(unread)} new emails!")
                
                for msg_id in unread:
                    # Fetch email content
                    email_data = await imap.fetch_messages(str(msg_id), "BODY[]")
                    email_text = email_data[str(msg_id)][b"BODY[]"].decode()
                    
                    # Extract verification codes (6 digits)
                    codes = re.findall(r'\b\d{6}\b', email_text)
                    if codes:
                        print(f"๐Ÿ” Verification code found: {codes[0]}")
                    
                    # Mark as read
                    await imap.store_message_flags(str(msg_id), [b"\\Seen"], "FLAGS")

            await anyio.sleep(5)  # 5-second polling proven effective
```

## Testing & Quality

### Comprehensive Test Suite

```bash
# Run all tests
uv run pytest

# RFC compliance tests
uv run pytest tests/rfc_compliance/ -v

# Real-server interoperability
uv run pytest tests/interop/ -v

# Type checking
uv run mypy src/

# Linting
uv run ruff check src/
```

### Real-Server Testing

AnyRFC is extensively tested against production servers:

- โœ… **WebSocket**: echo.websocket.org, Binance WebSocket API, major services
- โœ… **IMAP**: Live Gmail operations (read, flag, drafts, attachments)
- โœ… **SMTP**: Gmail, SendGrid, major SMTP services
- โœ… **Production verified**: Real-time email monitoring, 178KB+ file transfers
- โœ… **Compliance tested**: Autobahn WebSocket suite, RFC test vectors

## Protocol Roadmap

### โœ… Phase 1: WebSocket Foundation (Complete)

- [x] WebSocket Client (RFC 6455)
- [x] Autobahn test suite compliance
- [x] Real-world server compatibility

### โœ… Phase 2: Email Infrastructure (Complete)

- [x] **IMAP Client (RFC 9051)**
  - [x] Complete email operations (read, flag, search, delete)
  - [x] Draft creation with literal continuation
  - [x] Attachment extraction (binary BLOBs)
  - [x] Real-time email monitoring
  - [x] Gmail production testing
  - [x] Extensions: IDLE, SORT, THREAD, CONDSTORE, QRESYNC
- [x] SMTP Client Foundation (RFC 5321)
- [x] SASL authentication framework (RFC 4422)

### ๐Ÿšง Phase 3: OAuth & Modern Auth (In Progress)

- [ ] OAuth 2.0 client (RFC 6749/6750)
- [ ] JWT handling (RFC 7519)
- [ ] PKCE support (RFC 7636)
- [ ] Device authorization flow (RFC 8628)
- [ ] MIME message composition (RFC 2045-2049)
- [ ] Advanced SMTP features (DKIM, SPF validation)

### ๐Ÿ”ฎ Phase 4: Advanced Protocols

- [ ] SSH client suite (RFC 4251-4254)
- [ ] SFTP file transfer
- [ ] DNS-over-HTTPS (RFC 8484)
- [ ] CoAP for IoT (RFC 7252)

## Performance

AnyRFC is built for high-performance workloads:

```python
# Concurrent WebSocket connections
async def stress_test():
    async with anyio.create_task_group() as tg:
        for i in range(100):
            tg.start_soon(websocket_worker, f"wss://api{i}.example.com")

# Memory-efficient message streaming
async def large_mailbox():
    async with IMAPClient("imap.example.com") as imap:
        # Stream large mailboxes without loading everything into memory
        async for message in imap.fetch_messages("1:*", "BODY[]"):
            await process_message(message)  # Process one at a time
```

## Contributing

We welcome contributions! AnyRFC follows strict quality standards:

1. **RFC Compliance**: All features must be RFC-compliant
2. **AnyIO Only**: No asyncio imports allowed
3. **Type Safety**: Full mypy compliance required
4. **Real-World Testing**: Test against actual servers
5. **Security First**: Secure by default

See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.

## Security

- ๐Ÿ”’ **TLS Everywhere**: Secure connections by default
- ๐Ÿ›ก๏ธ **Input Validation**: Strict RFC-compliant parsing
- ๐Ÿ” **Credential Safety**: Never logs or stores credentials insecurely
- ๐Ÿ“‹ **Security Audits**: Regular dependency and code security reviews

Report security issues to: [andrew@elgert.org](mailto:andrew@elgert.org)

## License

MIT License - see [LICENSE](LICENSE) for details.

## Why "AnyRFC"?

**Any** + **RFC** = Protocol clients that work with **any** server implementing the **RFC** standard. Built on
**AnyIO** for structured concurrency.

---

**Built by [Andrew M. Elgert](https://github.com/elgertam) โ€ข [Documentation](https://github.com/elgertam/anyrfc#readme) โ€ข [Issues](https://github.com/elgertam/anyrfc/issues) โ€ข [PyPI](https://pypi.org/project/anyrfc/)**

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "anyrfc",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "\"Andrew M. Elgert\" <andrew@elgert.org>",
    "keywords": "anyio, async, client, imap, protocol, rfc, rfc5321, rfc6455, rfc9051, smtp, structured-concurrency, websocket",
    "author": null,
    "author_email": "\"Andrew M. Elgert\" <andrew@elgert.org>",
    "download_url": "https://files.pythonhosted.org/packages/47/dc/fecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354/anyrfc-0.3.1.tar.gz",
    "platform": null,
    "description": "# AnyRFC\n\n> **Complete, RFC-compliant protocol clients built with AnyIO structured concurrency**\n\n[![PyPI version](https://badge.fury.io/py/anyrfc.svg)](https://badge.fury.io/py/anyrfc)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\nAnyRFC provides **RFC-compliant protocol clients** that prioritize correctness, security, and modern\nasync patterns. Built exclusively with [AnyIO](https://anyio.readthedocs.io/) for structured concurrency.\n\n## Why AnyRFC?\n\n\ud83c\udfaf **RFC Compliance First** - Every implementation passes comprehensive RFC test suites  \n\u26a1 **Modern Async** - Structured concurrency with AnyIO (no asyncio dependency hell)  \n\ud83d\udd12 **Security by Default** - TLS everywhere, proper certificate validation, secure authentication  \n\ud83e\uddea **Battle-Tested** - Real-world interoperability testing against major servers  \n\ud83d\udcdd **Type Safe** - Full mypy compliance with strict typing  \n\ud83d\ude80 **Complete** - Full implementations, not toys or demos  \n\n## Quick Start\n\n```bash\npip install anyrfc\n```\n\n```python\nimport anyio\nfrom anyrfc import WebSocketClient\n\nasync def main():\n    async with WebSocketClient(\"wss://echo.websocket.org/\") as ws:\n        await ws.send_text(\"Hello, AnyRFC!\")\n        async for message in ws.receive():\n            print(f\"Received: {message}\")\n            break  # Just get the first message\n\nanyio.run(main)\n```\n\n## What's Included\n\n### \ud83c\udf10 WebSocket Client (RFC 6455)\n\nComplete WebSocket implementation with all RFC 6455 features:\n\n```python\nfrom anyrfc import WebSocketClient, CloseCode\n\nasync with WebSocketClient(\"wss://api.example.com/ws\") as ws:\n    # Send different message types\n    await ws.send_text(\"Hello!\")\n    await ws.send_binary(b\"\\\\x00\\\\x01\\\\x02\\\\x03\")\n\n    # Handle incoming messages\n    async for message in ws.receive():\n        if isinstance(message, str):\n            print(f\"Text: {message}\")\n        else:\n            print(f\"Binary: {message.hex()}\")\n\n        if should_close:\n            await ws.close(CloseCode.NORMAL_CLOSURE)\n            break\n```\n\n**Features:**\n\n- \u2705 All frame types (text, binary, ping, pong, close)\n- \u2705 Message fragmentation and reassembly\n- \u2705 Proper client-side frame masking\n- \u2705 Extension support framework\n- \u2705 Graceful connection handling\n- \u2705 Real-server compatibility\n\n### \ud83d\udce7 Email Clients (IMAP & SMTP)\n\nBattle-tested email clients with full RFC compliance and real-world Gmail compatibility:\n\n```python\nfrom anyrfc import IMAPClient, SMTPClient\n\n# IMAP - Complete email operations\nasync with IMAPClient(\"imap.gmail.com\", use_tls=True) as imap:\n    await imap.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n    await imap.select_mailbox(\"INBOX\")\n\n    # Search and read emails\n    messages = await imap.search_messages(\"UNSEEN\")\n    for msg_id in messages[:5]:\n        email = await imap.fetch_messages(str(msg_id), \"BODY[]\")\n        \n        # Mark as read\n        await imap.store_message_flags(str(msg_id), [b\"\\\\Seen\"], \"FLAGS\")\n\n    # Create drafts with proper literal continuation\n    await imap.append_message(\"Drafts\", email_content, [b\"\\\\Draft\"])\n\n    # Extract attachments as binary BLOBs\n    bodystructure = await imap.fetch_messages(str(msg_id), \"BODYSTRUCTURE\")\n    # Parse structure and fetch binary parts...\n\n# SMTP - Send emails with authentication\nasync with SMTPClient(\"smtp.gmail.com\", use_starttls=True) as smtp:\n    await smtp.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n    await smtp.send_message(\n        from_addr=\"sender@example.com\",\n        to_addrs=[\"recipient@example.com\"],\n        message=\"\"\"Subject: Hello from AnyRFC!\n\nThis email was sent using AnyRFC's SMTP client!\n\"\"\"\n    )\n```\n\n**IMAP Features (RFC 9051 Compliant):**\n\n- \u2705 **Complete email operations**: Read, flag, search, delete\n- \u2705 **Draft creation**: APPEND with proper literal continuation\n- \u2705 **Real-time monitoring**: Live email detection with polling\n- \u2705 **Attachment extraction**: Binary BLOB downloads (PDFs, images, etc.)\n- \u2705 **Gmail compatibility**: Tested with live Gmail IMAP servers\n- \u2705 **Extension support**: IDLE, SORT, THREAD, CONDSTORE, QRESYNC\n- \u2705 **Battle-tested**: Handles 178KB+ attachments and complex operations\n\n## Architecture Highlights\n\n### AnyIO Structured Concurrency\n\nEvery I/O operation uses AnyIO's structured concurrency primitives:\n\n```python\nasync def websocket_with_timeout():\n    async with anyio.create_task_group() as tg:\n        # Connection with automatic cleanup\n        tg.start_soon(websocket_handler)\n\n        # Heartbeat with cancellation scope\n        with anyio.move_on_after(30):\n            tg.start_soon(heartbeat_sender)\n```\n\n### RFC Compliance Testing\n\n```python\nfrom anyrfc.websocket import WebSocketClient\n\nclient = WebSocketClient(\"wss://example.com\")\ncompliance_report = await client.validate_compliance()\n\n# Returns detailed RFC 6455 test results\nassert compliance_report[\"handshake_validation\"] == True\nassert compliance_report[\"frame_parsing\"] == True\nassert compliance_report[\"close_sequence\"] == True\n```\n\n### Type Safety\n\n```python\nfrom anyrfc import WebSocketClient\nfrom anyrfc.websocket import WSFrame, OpCode\n\n# Fully typed interfaces\nclient: WebSocketClient = WebSocketClient(\"wss://api.example.com\")\nframe: WSFrame = WSFrame(fin=True, opcode=OpCode.TEXT, payload=b\"test\")\n\n# MyPy validates everything\nreveal_type(client.websocket_state)  # WSState\nreveal_type(await client.receive())  # Union[str, bytes]\n```\n\n## Installation & Setup\n\n### Basic Installation\n\n```bash\npip install anyrfc\n```\n\n### Development Setup\n\n```bash\ngit clone https://github.com/elgertam/anyrfc.git\ncd anyrfc\n\n# Install with uv (recommended)\nuv sync --all-extras\n\n# Or with pip\npip install -e \".[dev]\"\n```\n\n### Requirements\n\n- **Python**: 3.11+\n- **Core**: `anyio>=4.0.0`\n- **HTTP**: `httpx>=0.25.0` (approved dependency)\n- **Types**: `typing-extensions>=4.0.0`\n\n## Real-World Examples\n\n### WebSocket Trading Client\n\n```python\nfrom anyrfc import WebSocketClient\nimport json\n\nasync def crypto_prices():\n    # Binance public data stream (no authentication required)\n    uri = \"wss://data-stream.binance.vision/ws/btcusdt@ticker\"\n\n    # Use relaxed validation for real-world servers\n    async with WebSocketClient(uri, strict_rfc_validation=False) as ws:\n        async for message in ws.receive():\n            data = json.loads(message)\n            if 'c' in data:  # Current price\n                price = float(data['c'])\n                change = float(data['P'])  # 24hr change %\n                print(f\"\ud83d\udcb0 BTC-USDT: ${price:,.2f} ({change:+.2f}%)\")\n```\n\n### Email Monitoring Service\n\n```python\nfrom anyrfc import IMAPClient\nimport anyio\nimport re\n\nasync def email_monitor():\n    \"\"\"Real-time email monitoring with secret code extraction.\"\"\"\n    async with IMAPClient(\"imap.gmail.com\", use_tls=True) as imap:\n        await imap.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n        await imap.select_mailbox(\"INBOX\")\n\n        while True:\n            # Check for new emails every 5 seconds (production-tested)\n            unread = await imap.search_messages(\"UNSEEN\")\n            if unread:\n                print(f\"\ud83d\udce7 {len(unread)} new emails!\")\n                \n                for msg_id in unread:\n                    # Fetch email content\n                    email_data = await imap.fetch_messages(str(msg_id), \"BODY[]\")\n                    email_text = email_data[str(msg_id)][b\"BODY[]\"].decode()\n                    \n                    # Extract verification codes (6 digits)\n                    codes = re.findall(r'\\b\\d{6}\\b', email_text)\n                    if codes:\n                        print(f\"\ud83d\udd10 Verification code found: {codes[0]}\")\n                    \n                    # Mark as read\n                    await imap.store_message_flags(str(msg_id), [b\"\\\\Seen\"], \"FLAGS\")\n\n            await anyio.sleep(5)  # 5-second polling proven effective\n```\n\n## Testing & Quality\n\n### Comprehensive Test Suite\n\n```bash\n# Run all tests\nuv run pytest\n\n# RFC compliance tests\nuv run pytest tests/rfc_compliance/ -v\n\n# Real-server interoperability\nuv run pytest tests/interop/ -v\n\n# Type checking\nuv run mypy src/\n\n# Linting\nuv run ruff check src/\n```\n\n### Real-Server Testing\n\nAnyRFC is extensively tested against production servers:\n\n- \u2705 **WebSocket**: echo.websocket.org, Binance WebSocket API, major services\n- \u2705 **IMAP**: Live Gmail operations (read, flag, drafts, attachments)\n- \u2705 **SMTP**: Gmail, SendGrid, major SMTP services\n- \u2705 **Production verified**: Real-time email monitoring, 178KB+ file transfers\n- \u2705 **Compliance tested**: Autobahn WebSocket suite, RFC test vectors\n\n## Protocol Roadmap\n\n### \u2705 Phase 1: WebSocket Foundation (Complete)\n\n- [x] WebSocket Client (RFC 6455)\n- [x] Autobahn test suite compliance\n- [x] Real-world server compatibility\n\n### \u2705 Phase 2: Email Infrastructure (Complete)\n\n- [x] **IMAP Client (RFC 9051)**\n  - [x] Complete email operations (read, flag, search, delete)\n  - [x] Draft creation with literal continuation\n  - [x] Attachment extraction (binary BLOBs)\n  - [x] Real-time email monitoring\n  - [x] Gmail production testing\n  - [x] Extensions: IDLE, SORT, THREAD, CONDSTORE, QRESYNC\n- [x] SMTP Client Foundation (RFC 5321)\n- [x] SASL authentication framework (RFC 4422)\n\n### \ud83d\udea7 Phase 3: OAuth & Modern Auth (In Progress)\n\n- [ ] OAuth 2.0 client (RFC 6749/6750)\n- [ ] JWT handling (RFC 7519)\n- [ ] PKCE support (RFC 7636)\n- [ ] Device authorization flow (RFC 8628)\n- [ ] MIME message composition (RFC 2045-2049)\n- [ ] Advanced SMTP features (DKIM, SPF validation)\n\n### \ud83d\udd2e Phase 4: Advanced Protocols\n\n- [ ] SSH client suite (RFC 4251-4254)\n- [ ] SFTP file transfer\n- [ ] DNS-over-HTTPS (RFC 8484)\n- [ ] CoAP for IoT (RFC 7252)\n\n## Performance\n\nAnyRFC is built for high-performance workloads:\n\n```python\n# Concurrent WebSocket connections\nasync def stress_test():\n    async with anyio.create_task_group() as tg:\n        for i in range(100):\n            tg.start_soon(websocket_worker, f\"wss://api{i}.example.com\")\n\n# Memory-efficient message streaming\nasync def large_mailbox():\n    async with IMAPClient(\"imap.example.com\") as imap:\n        # Stream large mailboxes without loading everything into memory\n        async for message in imap.fetch_messages(\"1:*\", \"BODY[]\"):\n            await process_message(message)  # Process one at a time\n```\n\n## Contributing\n\nWe welcome contributions! AnyRFC follows strict quality standards:\n\n1. **RFC Compliance**: All features must be RFC-compliant\n2. **AnyIO Only**: No asyncio imports allowed\n3. **Type Safety**: Full mypy compliance required\n4. **Real-World Testing**: Test against actual servers\n5. **Security First**: Secure by default\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.\n\n## Security\n\n- \ud83d\udd12 **TLS Everywhere**: Secure connections by default\n- \ud83d\udee1\ufe0f **Input Validation**: Strict RFC-compliant parsing\n- \ud83d\udd10 **Credential Safety**: Never logs or stores credentials insecurely\n- \ud83d\udccb **Security Audits**: Regular dependency and code security reviews\n\nReport security issues to: [andrew@elgert.org](mailto:andrew@elgert.org)\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Why \"AnyRFC\"?\n\n**Any** + **RFC** = Protocol clients that work with **any** server implementing the **RFC** standard. Built on\n**AnyIO** for structured concurrency.\n\n---\n\n**Built by [Andrew M. Elgert](https://github.com/elgertam) \u2022 [Documentation](https://github.com/elgertam/anyrfc#readme) \u2022 [Issues](https://github.com/elgertam/anyrfc/issues) \u2022 [PyPI](https://pypi.org/project/anyrfc/)**\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Complete, RFC-compliant protocol clients using AnyIO structured concurrency",
    "version": "0.3.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/elgertam/anyrfc/issues",
        "Changelog": "https://github.com/elgertam/anyrfc/blob/master/CHANGELOG.md",
        "Documentation": "https://github.com/elgertam/anyrfc#readme",
        "Homepage": "https://github.com/elgertam/anyrfc",
        "Repository": "https://github.com/elgertam/anyrfc.git"
    },
    "split_keywords": [
        "anyio",
        " async",
        " client",
        " imap",
        " protocol",
        " rfc",
        " rfc5321",
        " rfc6455",
        " rfc9051",
        " smtp",
        " structured-concurrency",
        " websocket"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "947f4ff2ff0ce3a258e9e66e4ccc6ffd4789926e3ac4a311d0a2e38ffc9e8de7",
                "md5": "584dd50e917682afe8544daec6cdd167",
                "sha256": "828656c7b75eb53cd0d01b40704b69e7bc1ced8ae224ae4692425f6125b143cf"
            },
            "downloads": -1,
            "filename": "anyrfc-0.3.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "584dd50e917682afe8544daec6cdd167",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 85094,
            "upload_time": "2025-08-18T02:50:25",
            "upload_time_iso_8601": "2025-08-18T02:50:25.520032Z",
            "url": "https://files.pythonhosted.org/packages/94/7f/4ff2ff0ce3a258e9e66e4ccc6ffd4789926e3ac4a311d0a2e38ffc9e8de7/anyrfc-0.3.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "47dcfecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354",
                "md5": "11ff8a00f1ff21631d4316bd767f1f98",
                "sha256": "0c73ba6b89cff1f15d32f294688b290a370450ab9d8cd14db08740a6ecc0f0e2"
            },
            "downloads": -1,
            "filename": "anyrfc-0.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "11ff8a00f1ff21631d4316bd767f1f98",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 367468,
            "upload_time": "2025-08-18T02:50:26",
            "upload_time_iso_8601": "2025-08-18T02:50:26.517807Z",
            "url": "https://files.pythonhosted.org/packages/47/dc/fecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354/anyrfc-0.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-18 02:50:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "elgertam",
    "github_project": "anyrfc",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "anyrfc"
}
        
Elapsed time: 0.80652s