## Parser
[http_box::http1::Parser](https://docs.rs/http-box/0.1.5/http_box/http1/struct.Parser.html)
provides the guts of the HTTP/1.x parsing capabilities.
## HttpHandler
Implementing
[http_box::http1::HttpHandler](https://docs.rs/http-box/0.1.5/http_box/http1/trait.HttpHandler.html)
is how you provide a custom callback implementation. You can implement none, or
as many functions as you want.
Each `Parser` instance can be tied to only one instance of `HttpHandler`. Often
times, it's easiest to provide an `HttpHandler` implementation for each type of
data being processed: head, chunked transfer-encoded, multipart, URL encoded. In
doing so, you will also have a `Parser` instance for each of your `HttpHandler`
implementations. This helps keep code clean at the cost of a bit more memory
being used by multiple `Parser` instances. This is not to say that you are
unable to write a single `HttpHandler` implementation that handles all methods
of parsing.
## Callbacks
In a typical application, callbacks receive arguments that are complete pieces
of data. However, `Parser` parses data byte-by-byte, and because of this, it can
operate one byte at a time. Moreover, the data being parsed is often coming from
a network connection, and is received as incomplete segments of data. To stick
to the zero-copy philosophy, and to avoid buffering, callbacks are executed as
frequent as necessary.
Some callbacks are executed during multiple states. For example,
`HttpHandler::on_header_name()` is called during head parsing, chunked
transfer-encoded parsing, and multipart parsing. This is precisely why it makes
sense to split up `HttpHandler` implementation by method of parsing. Otherwise
you will be juggling too much state, and your implementation might end up
resembling Chet from the movie Weird Science when Lisa turns him into a steaming
pile of crap.
## Tracking State
Sometimes multiple states need to work together to produce a single result. A
good example of this is when headers are being parsed. The callback for the
header name may be called multiple times in order to receive the full header
name. And the same is true for the header value. It isn't until the header value
is complete, that the header name/value pair can be collectively handled.
This is where the
[http_box::http1::State](https://docs.rs/http-box/0.1.5/http_box/http1/enum.State.html)
enum comes into play. You can use this to track the current state when a
callback is executed. There is nothing mysterious about this enum. It's just a
helper type with the objective of simplifying state tracking.