|
Author: Pekka Helenius (~Fincer), 2018
|
|
|
|
This patch may break things badly, just be aware and proceed with care! Thanks.
|
|
|
|
This is an experimental patch, just introducing the principle of manipulating HTTP header response codes returned by
|
|
Apache HTTP server to a client. The patch is mainly for personal use, nothing else. If you see it worth it, feel free
|
|
to use it.
|
|
And absolutely, feel free to modify it! If you see it just awful, ignore it. Thanks.
|
|
|
|
The patch breaks HTTP standard by altering HTTP header response codes generated by Apache HTTP server. Generated codes are:
|
|
|
|
If client request generates HTTP response code 401, the server returns error code 401.
|
|
If client request generates HTTP response code 401->, the server returns error code 400.
|
|
If client request generates HTTP response code 500->, the server returns error code 400 instead.
|
|
|
|
Any other codes (100-308) will be returned normally, including 200 OK message.
|
|
|
|
Remember to comment any unsupported ErrorDocument directive fields from your VirtualHost configurations
|
|
before starting the server with this patch applied.
|
|
|
|
All Apache HTTP response codes are listed in 'modules/http/http_protocol.c' file.
|
|
|
|
|
|
|
|
|
|
|
|
--- a/modules/http/http_protocol.c
|
|
+++ b/modules/http/http_protocol.c
|
|
@@ -1003,7 +1003,20 @@ AP_DECLARE(int) ap_index_of_response(int
|
|
if (status < 100) {
|
|
pos = (status + shortcut[i]);
|
|
if (pos < shortcut[i + 1] && status_lines[pos] != NULL) {
|
|
- return pos;
|
|
+ if (shortcut[i] == LEVEL_400) { /* If code class is 400 */
|
|
+ if (pos != (1 + shortcut[i])) { /* If code in 400 class is not 401, then */
|
|
+ return (0 + shortcut[i]); /* Return 400 */
|
|
+ }
|
|
+ else {
|
|
+ return pos; /* Else return 401 */
|
|
+ }
|
|
+ }
|
|
+ else if (shortcut[i] == LEVEL_500) { /* If code class is 500 */
|
|
+ return (0 + shortcut[i - 1]); /* Return first value of previous code class 400 */
|
|
+ }
|
|
+ else {
|
|
+ return pos; /* Return normal code */
|
|
+ }
|
|
}
|
|
else {
|
|
return LEVEL_500; /* status unknown (falls in gap) */
|