|
Author: Pekka Helenius (~Fincer), 2018
|
|
|
|
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 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.
|
|
|
|
This patch may break things badly, just be aware and proceed with care! Thanks.
|
|
|
|
|
|
|
|
--- 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) */
|