Commit b8541a9e authored by rswindell's avatar rswindell
Browse files

Deuce's changes to the date parser and more.

parent 8d7332bc
......@@ -310,7 +310,8 @@ static int getmonth(char *mon)
static time_t decode_date(char *date)
{
struct tm ti;
char str[64];
char *token;
time_t t;
ti.tm_sec=0; /* seconds (0 - 60) */
ti.tm_min=0; /* minutes (0 - 59) */
......@@ -324,67 +325,87 @@ static time_t decode_date(char *date)
ti.tm_zone="UTC"; /* abbreviation of timezone name */
ti.tm_gmtoff=0; /* offset from UTC in seconds */
#endif
if(strtok(date,",")==NULL) {
lprintf("Parsing date: %s",date);
token=strtok(date,",");
/* This probobly only needs to be 9, but the extra one is for luck. */
if(strlen(date)>15) {
/* asctime() */
date=strtok(date," ");
SAFECOPY(str,date);
date=strtok(str," ");
ti.tm_mon=getmonth(str);
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
date=strtok(str," ");
ti.tm_mday=atoi(str);
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
date=strtok(str,":");
ti.tm_hour=atoi(str);
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
date=strtok(str,":");
ti.tm_min=atoi(str);
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
date=strtok(str," ");
ti.tm_sec=atoi(str);
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
ti.tm_year=atoi(str)-1900;
lprintf("asctime() Date: %s",token);
/* Toss away week day */
token=strtok(date," ");
token=strtok(NULL," ");
if(token==NULL)
return(0);
lprintf("Month: %s",token);
ti.tm_mon=getmonth(token);
token=strtok(NULL," ");
if(token==NULL)
return(0);
lprintf("MDay: %s",token);
ti.tm_mday=atoi(token);
token=strtok(NULL,":");
if(token==NULL)
return(0);
lprintf("Hour: %s",token);
ti.tm_hour=atoi(token);
token=strtok(NULL,":");
if(token==NULL)
return(0);
lprintf("Minute: %s",token);
ti.tm_min=atoi(token);
token=strtok(NULL," ");
if(token==NULL)
return(0);
lprintf("Second: %s",token);
ti.tm_sec=atoi(token);
token=strtok(NULL,"");
if(token==NULL)
return(0);
lprintf("Year: %s",token);
ti.tm_year=atoi(token)-1900;
}
else {
/* RFC 1123 or RFC 850 */
while(*date && *date<=' ') date++;
SAFECOPY(str,date);
date=strtok(str," -");
ti.tm_mday=atoi(str);
while(*date && *date<='0') date++;
SAFECOPY(str,date);
date=strtok(str," -");
ti.tm_mday=atoi(str);
while(*date && *date<='A') date++;
SAFECOPY(str,date);
date=strtok(str," -");
ti.tm_mon=getmonth(str);
while(*date && *date<='0') date++;
SAFECOPY(str,date);
date=strtok(str," ");
ti.tm_year=atoi(str);
while(*date && *date<='0') date++;
SAFECOPY(str,date);
date=strtok(str,":");
ti.tm_hour=atoi(str);
while(*date && *date<='0') date++;
SAFECOPY(str,date);
date=strtok(str,":");
ti.tm_min=atoi(str);
while(*date && *date<='0') date++;
SAFECOPY(str,date);
ti.tm_sec=atoi(str);
lprintf("RFC Date");
token=strtok(NULL," -");
if(token==NULL)
return(0);
lprintf("MDay: %s",token);
ti.tm_mday=atoi(token);
token=strtok(NULL," -");
if(token==NULL)
return(0);
lprintf("Month: %s",token);
ti.tm_mon=getmonth(token);
token=strtok(NULL," ");
if(token==NULL)
return(0);
lprintf("Year: %s",token);
ti.tm_year=atoi(token);
token=strtok(NULL,":");
if(token==NULL)
return(0);
lprintf("Hour: %s",token);
ti.tm_hour=atoi(token);
token=strtok(NULL,":");
if(token==NULL)
return(0);
lprintf("Min: %s",token);
ti.tm_min=atoi(token);
token=strtok(NULL," ");
if(token==NULL)
return(0);
lprintf("Sec: %s",token);
ti.tm_sec=atoi(token);
if(ti.tm_year>1900)
ti.tm_year -= 1900;
}
return(mktime(&ti));
t=mktime(&ti);
lprintf("Parsed date as: %d",t);
return(t);
}
static SOCKET open_socket(int type)
......@@ -470,10 +491,11 @@ static int get_mime_type(char *ext)
return(i);
}
void send_headers(http_session_t *session, const char *status)
BOOL send_headers(http_session_t *session, const char *status)
{
int ret;
size_t location_offset;
BOOL send_file=TRUE;
size_t location_offset;
time_t ti;
char status_line[MAX_REQUEST_LINE];
struct stat stats;
......@@ -484,11 +506,17 @@ void send_headers(http_session_t *session, const char *status)
if(!ret && (stats.st_mtime < session->req.if_modified_since)) {
SAFECOPY(status_line,"304 Not Modified");
ret=-1;
send_file=FALSE;
lprintf("Not modified");
}
if(session->req.send_location)
if(session->req.send_location) {
SAFECOPY(status_line,"301 Moved Permanently");
ret=-1;
send_file=FALSE;
lprintf("Moved Permanently");
}
/* Status-Line */
sockprintf(session->socket,"%s %s",http_vers[session->http_ver],status);
sockprintf(session->socket,"%s %s",http_vers[session->http_ver],status_line);
/* General Headers */
ti=time(NULL);
......@@ -518,6 +546,7 @@ void send_headers(http_session_t *session, const char *status)
sockprintf(session->socket,"%s: %s, %02d %s %04d %02d:%02d:%02d GMT",get_header(HEAD_LASTMODIFIED),days[t->tm_wday],t->tm_mday,months[t->tm_mon],t->tm_year+1900,t->tm_hour,t->tm_min,t->tm_sec);
}
sendsocket(session->socket,newline,2);
return(send_file);
}
static void sock_sendfile(SOCKET socket,char *path)
......@@ -621,7 +650,7 @@ static BOOL read_mime_types(void)
char * type;
FILE* mime_config;
sprintf(str,"%smime_types.cfg",startup->ctrl_dir);
sprintf(str,"%smime_types.cfg",scfg.ctrl_dir);
mime_config=fopen(str,"r");
if(mime_config==NULL) {
return(FALSE);
......@@ -714,7 +743,7 @@ static BOOL parse_headers(http_session_t * session)
sockreadline(session->socket,TIMEOUT_THREAD_WAIT,req_line+i,sizeof(req_line)-i);
}
strtok(req_line,":");
if((value=strtok(NULL,":"))!=NULL) {
if((value=strtok(NULL,""))!=NULL) {
i=get_header_type(req_line);
while(*value && *value<=' ') value++;
switch(i) {
......@@ -955,10 +984,12 @@ static BOOL check_request(http_session_t * session)
static void respond(http_session_t * session)
{
BOOL send_file=TRUE;
if(session->http_ver > HTTP_0_9)
send_headers(session,"200 OK");
sock_sendfile(session->socket,session->req.request);
send_file=send_headers(session,"200 OK");
if(send_file)
sock_sendfile(session->socket,session->req.request);
close_request(session);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment