mirror of
https://github.com/emikulic/darkhttpd.git
synced 2023-08-10 21:13:08 +03:00
. Got rid of conn->lastmod field.
. rfc1123_date() takes a destination buffer instead of having the one, static, global buffer.
This commit is contained in:
parent
6e0103cbc4
commit
6ee7a85231
@ -80,7 +80,7 @@ struct connection
|
|||||||
int header_dont_free, header_only, http_code;
|
int header_dont_free, header_only, http_code;
|
||||||
|
|
||||||
enum { REPLY_GENERATED, REPLY_FROMFILE } reply_type;
|
enum { REPLY_GENERATED, REPLY_FROMFILE } reply_type;
|
||||||
char *reply, *lastmod; /* reply lastmod, not request if-mod-since */
|
char *reply;
|
||||||
int reply_dont_free;
|
int reply_dont_free;
|
||||||
FILE *reply_file;
|
FILE *reply_file;
|
||||||
size_t reply_length, reply_sent;
|
size_t reply_length, reply_sent;
|
||||||
@ -665,7 +665,6 @@ static struct connection *new_connection(void)
|
|||||||
conn->header_only = 0;
|
conn->header_only = 0;
|
||||||
conn->http_code = 0;
|
conn->http_code = 0;
|
||||||
conn->reply = NULL;
|
conn->reply = NULL;
|
||||||
conn->lastmod = NULL;
|
|
||||||
conn->reply_dont_free = 0;
|
conn->reply_dont_free = 0;
|
||||||
conn->reply_file = NULL;
|
conn->reply_file = NULL;
|
||||||
conn->reply_sent = 0;
|
conn->reply_sent = 0;
|
||||||
@ -725,7 +724,6 @@ static void free_connection(struct connection *conn)
|
|||||||
if (conn->user_agent != NULL) free(conn->user_agent);
|
if (conn->user_agent != NULL) free(conn->user_agent);
|
||||||
if (conn->header != NULL && !conn->header_dont_free) free(conn->header);
|
if (conn->header != NULL && !conn->header_dont_free) free(conn->header);
|
||||||
if (conn->reply != NULL && !conn->reply_dont_free) free(conn->reply);
|
if (conn->reply != NULL && !conn->reply_dont_free) free(conn->reply);
|
||||||
if (conn->lastmod != NULL) free(conn->lastmod);
|
|
||||||
if (conn->reply_file != NULL) fclose(conn->reply_file);
|
if (conn->reply_file != NULL) fclose(conn->reply_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,17 +759,17 @@ static void poll_check_timeout(struct connection *conn)
|
|||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------
|
||||||
* Build an RFC1123 date in the static buffer _date[] and return it.
|
* Format [when] as an RFC1123 date, stored in the specified buffer. The same
|
||||||
|
* buffer is returned for convenience.
|
||||||
*/
|
*/
|
||||||
#define MAX_DATE_LENGTH 29 /* strlen("Fri, 28 Feb 2003 00:02:08 GMT") */
|
#define DATE_LEN 30 /* strlen("Fri, 28 Feb 2003 00:02:08 GMT")+1 */
|
||||||
static char _date[MAX_DATE_LENGTH + 1];
|
static char *rfc1123_date(char *dest, const time_t when)
|
||||||
static char *rfc1123_date(const time_t when)
|
|
||||||
{
|
{
|
||||||
time_t now = when;
|
time_t now = when;
|
||||||
if (strftime(_date, MAX_DATE_LENGTH,
|
if (strftime(dest, DATE_LEN,
|
||||||
"%a, %d %b %Y %H:%M:%S %Z", gmtime(&now) ) == 0)
|
"%a, %d %b %Y %H:%M:%S %Z", gmtime(&now) ) == 0)
|
||||||
errx(1, "strftime() failed");
|
errx(1, "strftime() failed [%s]", dest);
|
||||||
return _date;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -823,13 +821,16 @@ static char *urldecode(const char *url)
|
|||||||
static void default_reply(struct connection *conn,
|
static void default_reply(struct connection *conn,
|
||||||
const int errcode, const char *errname, const char *format, ...)
|
const int errcode, const char *errname, const char *format, ...)
|
||||||
{
|
{
|
||||||
char *reason;
|
char *reason, date[DATE_LEN];
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va, format);
|
va_start(va, format);
|
||||||
xvasprintf(&reason, format, va);
|
xvasprintf(&reason, format, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
|
/* Only really need to calculate the date once. */
|
||||||
|
(void)rfc1123_date(date, time(NULL));
|
||||||
|
|
||||||
conn->reply_length = xasprintf(&(conn->reply),
|
conn->reply_length = xasprintf(&(conn->reply),
|
||||||
"<html><head><title>%d %s</title></head><body>\n"
|
"<html><head><title>%d %s</title></head><body>\n"
|
||||||
"<h1>%s</h1>\n" /* errname */
|
"<h1>%s</h1>\n" /* errname */
|
||||||
@ -837,7 +838,7 @@ static void default_reply(struct connection *conn,
|
|||||||
"<hr>\n"
|
"<hr>\n"
|
||||||
"Generated by %s on %s\n"
|
"Generated by %s on %s\n"
|
||||||
"</body></html>\n",
|
"</body></html>\n",
|
||||||
errcode, errname, errname, reason, pkgname, rfc1123_date(time(NULL)));
|
errcode, errname, errname, reason, pkgname, date);
|
||||||
free(reason);
|
free(reason);
|
||||||
|
|
||||||
conn->header_length = xasprintf(&(conn->header),
|
conn->header_length = xasprintf(&(conn->header),
|
||||||
@ -848,8 +849,7 @@ static void default_reply(struct connection *conn,
|
|||||||
"Content-Length: %d\r\n"
|
"Content-Length: %d\r\n"
|
||||||
"Content-Type: text/html\r\n"
|
"Content-Type: text/html\r\n"
|
||||||
"\r\n",
|
"\r\n",
|
||||||
errcode, errname, rfc1123_date(time(NULL)), pkgname,
|
errcode, errname, date, pkgname, conn->reply_length);
|
||||||
conn->reply_length);
|
|
||||||
|
|
||||||
conn->reply_type = REPLY_GENERATED;
|
conn->reply_type = REPLY_GENERATED;
|
||||||
conn->http_code = errcode;
|
conn->http_code = errcode;
|
||||||
@ -924,6 +924,7 @@ static void parse_request(struct connection *conn)
|
|||||||
static void process_get(struct connection *conn)
|
static void process_get(struct connection *conn)
|
||||||
{
|
{
|
||||||
char *decoded_url, *safe_url, *target, *if_mod_since;
|
char *decoded_url, *safe_url, *target, *if_mod_since;
|
||||||
|
char date[DATE_LEN], lastmod[DATE_LEN];
|
||||||
const char *mimetype = NULL;
|
const char *mimetype = NULL;
|
||||||
struct stat filestat;
|
struct stat filestat;
|
||||||
|
|
||||||
@ -986,12 +987,12 @@ static void process_get(struct connection *conn)
|
|||||||
|
|
||||||
conn->reply_type = REPLY_FROMFILE;
|
conn->reply_type = REPLY_FROMFILE;
|
||||||
conn->reply_length = filestat.st_size;
|
conn->reply_length = filestat.st_size;
|
||||||
conn->lastmod = xstrdup(rfc1123_date(filestat.st_mtime));
|
(void) rfc1123_date(lastmod, filestat.st_mtime);
|
||||||
|
|
||||||
/* check for If-Modified-Since, may not have to send */
|
/* check for If-Modified-Since, may not have to send */
|
||||||
if_mod_since = parse_field(conn, "If-Modified-Since: ");
|
if_mod_since = parse_field(conn, "If-Modified-Since: ");
|
||||||
if (if_mod_since != NULL &&
|
if (if_mod_since != NULL &&
|
||||||
strcmp(if_mod_since, conn->lastmod) == 0)
|
strcmp(if_mod_since, lastmod) == 0)
|
||||||
{
|
{
|
||||||
debugf("not modified since %s\n", if_mod_since);
|
debugf("not modified since %s\n", if_mod_since);
|
||||||
default_reply(conn, 304, "Not Modified", "");
|
default_reply(conn, 304, "Not Modified", "");
|
||||||
@ -1009,8 +1010,8 @@ static void process_get(struct connection *conn)
|
|||||||
"Last-Modified: %s\r\n"
|
"Last-Modified: %s\r\n"
|
||||||
"\r\n"
|
"\r\n"
|
||||||
,
|
,
|
||||||
rfc1123_date(time(NULL)), pkgname, conn->reply_length,
|
rfc1123_date(date, time(NULL)), pkgname, conn->reply_length,
|
||||||
mimetype, conn->lastmod
|
mimetype, lastmod
|
||||||
);
|
);
|
||||||
conn->http_code = 200;
|
conn->http_code = 200;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user