diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index 194cf1b78071531e68d76e180835ed9345649721..1a8336284d933186e5d9928ec4241d055b2db763 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -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); }