As we saw in the last chapter, the connector subsystem was responsible for receiving the incoming request, converting it into an internal protocol-agnostic representation, and then passing it on to the engine for further processing.
All the complexity specific to a given protocol is abstracted away by the connector subsystem, allowing the engine to focus purely on the processing of the request. This has the beneficial effect of allowing a single engine to support multiple protocols such as HTTP or AJP.
An engine processes the request, by delegating to a child container, and returns the resulting protocol-agnostic response to the connector subsystem, which makes the response conform to the protocol understood by its client.
The key decision ...