CONTRIBUTING.md

# Contributing to hackney

Thank you for your interest in contributing to hackney!

## Getting Started

1. Fork the repository
2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/hackney.git`
3. Create a branch: `git checkout -b my-feature`
4. Make your changes
5. Run tests: `rebar3 eunit`
6. Push and open a pull request

## Pull Request Guidelines

### Title Format

We use [Conventional Commits](https://www.conventionalcommits.org/) for PR titles:

```
<type>: <description>
```

**Types:**

| Type | Description |
|------|-------------|
| `feat` | New feature |
| `fix` | Bug fix |
| `docs` | Documentation only |
| `refactor` | Code change that neither fixes a bug nor adds a feature |
| `perf` | Performance improvement |
| `test` | Adding or updating tests |
| `chore` | Maintenance tasks, dependencies |
| `security` | Security fix |

**Examples:**

- `feat: add HTTP/3 connection pooling`
- `fix: handle timeout in async responses`
- `docs: update WebSocket guide`
- `refactor: simplify connection state machine`
- `perf: reduce memory allocation in header parsing`
- `security: update SSL certificate bundle`

### Description

Include in your PR description:

- **What** the change does
- **Why** the change is needed
- **How** to test it (if applicable)

## Development Setup

### Requirements

- Erlang/OTP 27+
- rebar3

### Building

```sh
rebar3 compile
```

### Building with QUIC support

QUIC/HTTP3 requires lsquic and BoringSSL (vendored in `c_src/`):

```sh
HACKNEY_QUIC_OPTS="-DCMAKE_BUILD_TYPE=Release" rebar3 compile
```

### Running Tests

```sh
# All tests
rebar3 eunit

# Specific test module
rebar3 eunit --module=hackney_conn_tests

# With verbose output
rebar3 eunit --verbose
```

### Running Dialyzer

```sh
rebar3 dialyzer
```

## Code Style

- Follow existing code conventions
- Keep functions short and focused
- Add specs for exported functions
- Update documentation for API changes

## Reporting Issues

When reporting bugs, include:

- Erlang/OTP version (`erl -version`)
- hackney version
- Minimal reproduction case
- Expected vs actual behavior

## Questions?

Open an issue or reach out to the maintainers.