diff options
-rw-r--r-- | networking/httpd.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index a1f841aa8..94f7297ad 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
@@ -215,6 +215,16 @@ | |||
215 | //config: Makes httpd send files using GZIP content encoding if the | 215 | //config: Makes httpd send files using GZIP content encoding if the |
216 | //config: client supports it and a pre-compressed <file>.gz exists. | 216 | //config: client supports it and a pre-compressed <file>.gz exists. |
217 | //config: | 217 | //config: |
218 | //config:config FEATURE_HTTPD_LAST_MODIFIED | ||
219 | //config: bool "Add Last-Modified header to response" | ||
220 | //config: default y | ||
221 | //config: depends on HTTPD | ||
222 | //config: help | ||
223 | //config: The Last-Modified header is used for cache validation. | ||
224 | //config: The client sends last seen mtime to server in If-Modified-Since. | ||
225 | //config: Both headers MUST be an RFC 1123 formatted, which is hard to parse. | ||
226 | //config: Use ETag header instead. | ||
227 | //config: | ||
218 | //config:config FEATURE_HTTPD_DATE | 228 | //config:config FEATURE_HTTPD_DATE |
219 | //config: bool "Add Date header to response" | 229 | //config: bool "Add Date header to response" |
220 | //config: default y | 230 | //config: default y |
@@ -1046,11 +1056,12 @@ static void log_and_exit(void) | |||
1046 | */ | 1056 | */ |
1047 | static void send_headers(unsigned responseNum) | 1057 | static void send_headers(unsigned responseNum) |
1048 | { | 1058 | { |
1059 | #if ENABLE_FEATURE_HTTPD_DATE || ENABLE_FEATURE_HTTPD_LAST_MODIFIED | ||
1049 | static const char RFC1123FMT[] ALIGN1 = "%a, %d %b %Y %H:%M:%S GMT"; | 1060 | static const char RFC1123FMT[] ALIGN1 = "%a, %d %b %Y %H:%M:%S GMT"; |
1050 | /* Fixed size 29-byte string. Example: Sun, 06 Nov 1994 08:49:37 GMT */ | 1061 | /* Fixed size 29-byte string. Example: Sun, 06 Nov 1994 08:49:37 GMT */ |
1051 | char date_str[40]; /* using a bit larger buffer to paranoia reasons */ | 1062 | char date_str[40]; /* using a bit larger buffer to paranoia reasons */ |
1052 | |||
1053 | struct tm tm; | 1063 | struct tm tm; |
1064 | #endif | ||
1054 | const char *responseString = ""; | 1065 | const char *responseString = ""; |
1055 | const char *infoString = NULL; | 1066 | const char *infoString = NULL; |
1056 | #if ENABLE_FEATURE_HTTPD_ERROR_PAGES | 1067 | #if ENABLE_FEATURE_HTTPD_ERROR_PAGES |
@@ -1058,7 +1069,6 @@ static void send_headers(unsigned responseNum) | |||
1058 | #endif | 1069 | #endif |
1059 | unsigned len; | 1070 | unsigned len; |
1060 | unsigned i; | 1071 | unsigned i; |
1061 | time_t timer = time(NULL); | ||
1062 | 1072 | ||
1063 | for (i = 0; i < ARRAY_SIZE(http_response_type); i++) { | 1073 | for (i = 0; i < ARRAY_SIZE(http_response_type); i++) { |
1064 | if (http_response_type[i] == responseNum) { | 1074 | if (http_response_type[i] == responseNum) { |
@@ -1079,11 +1089,13 @@ static void send_headers(unsigned responseNum) | |||
1079 | * always fit into those kbytes. | 1089 | * always fit into those kbytes. |
1080 | */ | 1090 | */ |
1081 | 1091 | ||
1092 | { | ||
1082 | #if ENABLE_FEATURE_HTTPD_DATE | 1093 | #if ENABLE_FEATURE_HTTPD_DATE |
1083 | strftime(date_str, sizeof(date_str), RFC1123FMT, gmtime_r(&timer, &tm)); | 1094 | time_t timer = time(NULL); |
1084 | /* ^^^ using gmtime_r() instead of gmtime() to not use static data */ | 1095 | strftime(date_str, sizeof(date_str), RFC1123FMT, gmtime_r(&timer, &tm)); |
1096 | /* ^^^ using gmtime_r() instead of gmtime() to not use static data */ | ||
1085 | #endif | 1097 | #endif |
1086 | len = sprintf(iobuf, | 1098 | len = sprintf(iobuf, |
1087 | "HTTP/1.1 %u %s\r\n" | 1099 | "HTTP/1.1 %u %s\r\n" |
1088 | #if ENABLE_FEATURE_HTTPD_DATE | 1100 | #if ENABLE_FEATURE_HTTPD_DATE |
1089 | "Date: %s\r\n" | 1101 | "Date: %s\r\n" |
@@ -1093,7 +1105,8 @@ static void send_headers(unsigned responseNum) | |||
1093 | #if ENABLE_FEATURE_HTTPD_DATE | 1105 | #if ENABLE_FEATURE_HTTPD_DATE |
1094 | ,date_str | 1106 | ,date_str |
1095 | #endif | 1107 | #endif |
1096 | ); | 1108 | ); |
1109 | } | ||
1097 | 1110 | ||
1098 | if (responseNum != HTTP_OK || found_mime_type) { | 1111 | if (responseNum != HTTP_OK || found_mime_type) { |
1099 | len += sprintf(iobuf + len, | 1112 | len += sprintf(iobuf + len, |
@@ -1145,7 +1158,9 @@ static void send_headers(unsigned responseNum) | |||
1145 | #endif | 1158 | #endif |
1146 | 1159 | ||
1147 | if (file_size != -1) { /* file */ | 1160 | if (file_size != -1) { /* file */ |
1161 | #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED | ||
1148 | strftime(date_str, sizeof(date_str), RFC1123FMT, gmtime_r(&last_mod, &tm)); | 1162 | strftime(date_str, sizeof(date_str), RFC1123FMT, gmtime_r(&last_mod, &tm)); |
1163 | #endif | ||
1149 | #if ENABLE_FEATURE_HTTPD_RANGES | 1164 | #if ENABLE_FEATURE_HTTPD_RANGES |
1150 | if (responseNum == HTTP_PARTIAL_CONTENT) { | 1165 | if (responseNum == HTTP_PARTIAL_CONTENT) { |
1151 | len += sprintf(iobuf + len, | 1166 | len += sprintf(iobuf + len, |
@@ -1190,7 +1205,9 @@ static void send_headers(unsigned responseNum) | |||
1190 | #if ENABLE_FEATURE_HTTPD_RANGES | 1205 | #if ENABLE_FEATURE_HTTPD_RANGES |
1191 | "Accept-Ranges: bytes\r\n" | 1206 | "Accept-Ranges: bytes\r\n" |
1192 | #endif | 1207 | #endif |
1208 | #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED | ||
1193 | "Last-Modified: %s\r\n" | 1209 | "Last-Modified: %s\r\n" |
1210 | #endif | ||
1194 | /* Because of 4.4 (5), we can forgo sending of "Content-Length" | 1211 | /* Because of 4.4 (5), we can forgo sending of "Content-Length" |
1195 | * since we close connection afterwards, but it helps clients | 1212 | * since we close connection afterwards, but it helps clients |
1196 | * to e.g. estimate download times, show progress bars etc. | 1213 | * to e.g. estimate download times, show progress bars etc. |
@@ -1198,7 +1215,9 @@ static void send_headers(unsigned responseNum) | |||
1198 | * but de-facto standard is to send it (see comment below). | 1215 | * but de-facto standard is to send it (see comment below). |
1199 | */ | 1216 | */ |
1200 | "Content-Length: %"OFF_FMT"u\r\n", | 1217 | "Content-Length: %"OFF_FMT"u\r\n", |
1218 | #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED | ||
1201 | date_str, | 1219 | date_str, |
1220 | #endif | ||
1202 | file_size | 1221 | file_size |
1203 | ); | 1222 | ); |
1204 | } | 1223 | } |