Раздел 11. Developer Documentation RU EN Пункт 220. Request Processing in 2.x WarningWarning - this is a first (fast) draft that needs further revision! Several changes in 2.0 and above affect the internal request processing mechanics. Module authors need to be aware of these changes so they may take advantage of the optimizations and security enhancements. The first major change is to the subrequest and redirect
mechanisms. There were a number of different code paths in
the Apache HTTP Server 1.3 to attempt to optimize subrequest
or redirect behavior. As patches were introduced to 2.0, these
optimizations (and the server behavior) were quickly broken due
to this duplication of code. All duplicate code has been folded
back into This means that much of the existing code was 'unoptimized'. It is the Apache HTTP Project's first goal to create a robust and correct implementation of the HTTP server RFC. Additional goals include security, scalability and optimization. New methods were sought to optimize the server (beyond the performance of 1.3) without introducing fragile or insecure code. The Request Processing CycleAll requests pass through To streamline requests, the module author can take advantage of the hooks offered to drop out of the request cycle early, or to bypass core hooks which are irrelevant (and costly in terms of CPU.) The Request Parsing PhaseUnescapes the URLThe request's This step is bypassed if the proxyreq flag is set, or the
Strips Parent and This Elements from the URIAll This step cannot be bypassed. Initial URI Location WalkEvery request is subject to an
translate_nameModules can determine the file name, or alter the given URI
in this step. For example, If all modules Hook: map_to_storageAfter the file or correct URI was determined, the
appropriate per-dir configurations are merged together. For
example, URI Location WalkEvery request is hardened by a second
Hook: header_parserThe main request then parses the client's headers. This prepares the remaining request processing steps to better serve the client's request. The Security PhaseNeeds Documentation. Code is: if ((access_status = ap_run_access_checker(r)) != 0) { return decl_die(access_status, "check access", r); } if ((access_status = ap_run_check_user_id(r)) != 0) { return decl_die(access_status, "check user", r); } if ((access_status = ap_run_auth_checker(r)) != 0) { return decl_die(access_status, "check authorization", r); } The Preparation PhaseHook: type_checkerThe modules have an opportunity to test the URI or filename
against the target resource, and set mime information for the
request. Both If all modules Hook: fixupsMany modules are 'trounced' by some phase above. The fixups phase is used by modules to 'reassert' their ownership or force the request's fields to their appropriate values. It isn't always the cleanest mechanism, but occasionally it's the only option. The Handler PhaseThis phase is not part of the processing in
Hook: insert_filterModules that transform the content in some way can insert their values and override existing filters, such that if the user configured a more advanced filter out-of-order, then the module can move its order as need be. There is no result code, so actions in this hook better be trusted to always succeed. Hook: handlerThe module finally has a chance to serve the request in its
handler hook. Note that not every prepared request is sent to
the handler hook. Many modules, such as |