chuck 96/10/27 10:30:00
Modified: src/modules/proxy Makefile mod_proxy.h proxy_cache.c
proxy_http.c proxy_util.c
Log:
Changes to use new util_date.c functions
Revision Changes Path
1.8 +1 -0 apache/src/modules/proxy/Makefile
Index: Makefile
===================================================================
RCS file: /export/home/cvs/apache/src/modules/proxy/Makefile,v
retrieving revision 1.7
retrieving revision 1.8
diff -C3 -r1.7 -r1.8
*** Makefile 1996/10/20 23:58:59 1.7
--- Makefile 1996/10/27 18:29:55 1.8
***************
*** 83,86 ****
--- 83,87 ----
$(OBJS): mod_proxy.h $(INCDIR)/httpd.h $(INCDIR)/http_config.h
$(INCDIR)/http_protocol.h
proxy_cache.o proxy_connect.o proxy_ftp.o proxy_http.o proxy_util.o:
$(INCDIR)/http_main.h
proxy_cache.o proxy_connect.o proxy_http.o: $(INCDIR)/http_log.h
+ proxy_cache.o proxy_http.o: $(INCDIR)/util_date.h
proxy_cache.o proxy_util.o: $(INCDIR)/md5.h
1.4 +0 -3 apache/src/modules/proxy/mod_proxy.h
Index: mod_proxy.h
===================================================================
RCS file: /export/home/cvs/apache/src/modules/proxy/mod_proxy.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C3 -r1.3 -r1.4
*** mod_proxy.h 1996/10/20 23:59:00 1.3
--- mod_proxy.h 1996/10/27 18:29:56 1.4
***************
*** 265,273 ****
void proxy_send_headers(BUFF *fp, const char *respline, array_header
*hdrs_arr);
int proxy_liststr(const char *list, const char *val);
void proxy_hash(const char *it, char *val,int ndepth,int nlength);
- int proxy_checkmask(const char *data, const char *mask);
- int proxy_tm2sec(const struct tm *t);
- int proxy_parsedate(const char *date, struct tm *d);
int proxy_hex2sec(const char *x);
void proxy_sec2hex(int t, char *y);
void proxy_log_uerror(const char *routine, const char *file, const char
*err,
--- 265,270 ----
1.4 +8 -7 apache/src/modules/proxy/proxy_cache.c
Index: proxy_cache.c
===================================================================
RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_cache.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C3 -r1.3 -r1.4
*** proxy_cache.c 1996/10/20 23:59:00 1.3
--- proxy_cache.c 1996/10/27 18:29:56 1.4
***************
*** 57,62 ****
--- 57,63 ----
#include "mod_proxy.h"
#include "http_log.h"
#include "http_main.h"
+ #include "util_date.h"
#include <utime.h>
struct gc_ent
***************
*** 272,278 ****
close(fd);
line[i] = '\0';
expire = proxy_hex2sec(line+18);
! if (!proxy_checkmask(line, "&&&&&&&& &&&&&&&& &&&&&&&&") ||
expire == -1)
{
/* bad file */
--- 273,279 ----
close(fd);
line[i] = '\0';
expire = proxy_hex2sec(line+18);
! if (!checkmask(line, "&&&&&&&& &&&&&&&& &&&&&&&&") ||
expire == -1)
{
/* bad file */
***************
*** 341,347 ****
if (len == 0 || urlbuff[len-1] != '\n') return 0;
urlbuff[len-1] = '\0';
! if (!proxy_checkmask(urlbuff,
"&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&"))
return 0;
--- 342,348 ----
if (len == 0 || urlbuff[len-1] != '\n') return 0;
urlbuff[len-1] = '\0';
! if (!checkmask(urlbuff,
"&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&"))
return 0;
***************
*** 428,434 ****
{
/* this may modify the value in the original table */
imstr = proxy_date_canon(r->pool, imstr);
! c->ims = proxy_parsedate(imstr, NULL);
if (c->ims == -1) /* bad or out of range date; remove it */
table_set(r->headers_in, "If-Modified-Since", NULL);
}
--- 429,435 ----
{
/* this may modify the value in the original table */
imstr = proxy_date_canon(r->pool, imstr);
! c->ims = parseHTTPdate(imstr);
if (c->ims == -1) /* bad or out of range date; remove it */
table_set(r->headers_in, "If-Modified-Since", NULL);
}
***************
*** 582,588 ****
* read it
*/
expire = proxy_get_header(resp_hdrs, "Expires");
! if (expire != NULL) expc = proxy_parsedate(expire->value, NULL);
else expc = -1;
/*
--- 583,589 ----
* read it
*/
expire = proxy_get_header(resp_hdrs, "Expires");
! if (expire != NULL) expc = parseHTTPdate(expire->value);
else expc = -1;
/*
***************
*** 591,597 ****
lmods = proxy_get_header(resp_hdrs, "Last-Modified");
if (lmods != NULL)
{
! lmod = proxy_parsedate(lmods->value, NULL);
if (lmod == -1)
{
/* kill last modified date */
--- 592,598 ----
lmods = proxy_get_header(resp_hdrs, "Last-Modified");
if (lmods != NULL)
{
! lmod = parseHTTPdate(lmods->value);
if (lmod == -1)
{
/* kill last modified date */
***************
*** 636,642 ****
* Read the date. Generate one if one is not supplied
*/
dates = proxy_get_header(resp_hdrs, "Date");
! if (dates != NULL) date = proxy_parsedate(dates->value, NULL);
else date = -1;
now = time(NULL);
--- 637,643 ----
* Read the date. Generate one if one is not supplied
*/
dates = proxy_get_header(resp_hdrs, "Date");
! if (dates != NULL) date = parseHTTPdate(dates->value);
else date = -1;
now = time(NULL);
***************
*** 671,677 ****
if (expire == NULL && c->fp != NULL) /* no expiry data sent in
response */
{
expire = proxy_get_header(c->hdrs, "Expires");
! if (expire != NULL) expc = proxy_parsedate(expire->value, NULL);
}
/* so we now have the expiry date */
/* if no expiry date then
--- 672,678 ----
if (expire == NULL && c->fp != NULL) /* no expiry data sent in
response */
{
expire = proxy_get_header(c->hdrs, "Expires");
! if (expire != NULL) expc = parseHTTPdate(expire->value);
}
/* so we now have the expiry date */
/* if no expiry date then
1.5 +2 -1 apache/src/modules/proxy/proxy_http.c
Index: proxy_http.c
===================================================================
RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_http.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C3 -r1.4 -r1.5
*** proxy_http.c 1996/10/20 23:59:02 1.4
--- proxy_http.c 1996/10/27 18:29:57 1.5
***************
*** 55,60 ****
--- 55,61 ----
#include "mod_proxy.h"
#include "http_log.h"
#include "http_main.h"
+ #include "util_date.h"
/*
* Canonicalise http-like URLs.
***************
*** 228,234 ****
}
/* Is it an HTTP/1 response? */
! if (proxy_checkmask(buffer, "HTTP/#.# ### *"))
{
/* If not an HTTP/1 messsage or if the status line was > 8192 bytes */
if (buffer[5] != '1' || buffer[len-1] != '\n')
--- 229,235 ----
}
/* Is it an HTTP/1 response? */
! if (checkmask(buffer, "HTTP/#.# ### *"))
{
/* If not an HTTP/1 messsage or if the status line was > 8192 bytes */
if (buffer[5] != '1' || buffer[len-1] != '\n')
1.5 +0 -188 apache/src/modules/proxy/proxy_util.c
Index: proxy_util.c
===================================================================
RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_util.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C3 -r1.4 -r1.5
*** proxy_util.c 1996/10/20 23:59:03 1.4
--- proxy_util.c 1996/10/27 18:29:57 1.5
***************
*** 295,312 ****
/* check date */
for (mon=0; mon < 12; mon++) if (strcmp(month, months[mon]) == 0) break;
if (mon == 12) return x;
- /*
- * it doesn't do any harm to convert an invalid date from one format to
- * another
- */
- #if 0
- if (hour > 23 || min > 60 || sec > 62 || mday == 0 || mday > 31) return
x;
- if (mday == 31 && (mon == 1 || mon == 3 || mon == 5 || mon == 8 || mon
== 10))
- return x;
- if (mday > 29 && mon == 1) return x;
- if (mday == 29 && mon == 1)
- if (year%4 != 0 || (year%100 == 0 && year%400 != 0)) return x;
- #endif
if (strlen(x) < 31) x = palloc(p, 31);
sprintf(x, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", wday[wk], mday,
--- 295,300 ----
***************
*** 587,768 ****
}
memcpy(&val[i],&tmp[k],22-k);
val[i+22-k]='\0';
- }
-
- /*
- * Compare a string to a mask
- * Mask characters:
- * @ - uppercase letter
- * # - lowercase letter
- * & - hex digit
- * # - digit
- * * - swallow remaining characters
- * <x> - exact match for any other character
- */
- int
- proxy_checkmask(const char *data, const char *mask)
- {
- int i, ch, d;
-
- for (i=0; mask[i] != '\0' && mask[i] != '*'; i++)
- {
- ch = mask[i];
- d = data[i];
- if (ch == '@')
- {
- if (!isupper(d)) return 0;
- } else if (ch == '$')
- {
- if (!islower(d)) return 0;
- } else if (ch == '#')
- {
- if (!isdigit(d)) return 0;
- } else if (ch == '&')
- {
- if (!isxdigit(d)) return 0;
- } else if (ch != d) return 0;
- }
-
- if (mask[i] == '*') return 1;
- else return (data[i] == '\0');
- }
-
- /*
- * This routine converts a tm structure into the number of seconds
- * since 1st January 1970 UT
- *
- * The return value is a non-negative integer on success or -1 if the
- * input date is out of the domain Thu, 01 Jan 1970 00:00:00 to
- * Tue, 19 Jan 2038 03:14:07 inclusive
- *
- * Notes
- * This routine has been tested on 1000000 valid dates generated
- * at random by gmtime().
- *
- * This routine is very fast, much faster than mktime().
- */
- int
- proxy_tm2sec(const struct tm *t)
- {
- int days, year;
- static const int dayoffs[12]=
- {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275};
-
- year = t->tm_year;
- /* shift new year to 1st March; which is where it should be */
- if (t->tm_mon < 2) year--; /* now years and months since 1st March
1900 */
- days = t->tm_mday - 1 + dayoffs[t->tm_mon];
-
- /* find the number of days since 1st March 1900 (in the Gregorian calendar)
*/
- days += year * 365 + year/4 - year/100 + (year/100 + 3)/4;
- days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */
-
- days = ((days * 24 + t->tm_hour) * 60 + t->tm_min) * 60 + t->tm_sec;
- if (year < 69 || year > 138 || days < 0) /* must have overflowed */
- return -1;
- else
- return days;
- }
-
- /*
- * Parses a standard HTTP date.
- *
- * The restricted HTTP syntax is
- * rfc1123-date = day "," SP 2DIGIT SP date SP time SP "GMT"
- * date = 2DIGIT SP month SP 4DIGIT
- * time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
- *
- * day = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"
- *
- * month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" |
- * "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
- *
- * The spec is not clear as to whether the day and months are
- * case-sensitive or not. This code assumes they are.
- *
- * It fills in the year, month, mday, hour, min, sec and is_dst fields of
- * date. It does not set the wday or yday fields.
- * On failure is sets the year to 0.
- *
- * It also returns the number of seconds since 1 Jan 1970 UT, or
- * -1 if this would be out of range or if the date is invalid.
- *
- * Notes
- * This routine has been tested on 100000 valid dates generated
- * at random by strftime().
- *
- * This routine is very fast; it would be 10x slower if it
- * used sscanf.
- *
- * From Andrew Daviel <[EMAIL PROTECTED]> 29 Jul 96:
- *
- * Expanded to include RFC850 date (used by Netscape)
- * rfc850-date = weekday "," SP 2DIGIT "-" month "-" 2DIGIT SP time SP
"GMT"
- * Netscape also appends "; length nnnn" to If-Modified-Since; allow this
- *
- */
- int
- proxy_parsedate(const char *date, struct tm *d)
- {
- int mint, mon, year;
- char* comma;
- int lday;
- struct tm x;
- const int months[12]={
- ('J' << 16) | ( 'a' << 8) | 'n', ('F' << 16) | ( 'e' << 8) | 'b',
- ('M' << 16) | ( 'a' << 8) | 'r', ('A' << 16) | ( 'p' << 8) | 'r',
- ('M' << 16) | ( 'a' << 8) | 'y', ('J' << 16) | ( 'u' << 8) | 'n',
- ('J' << 16) | ( 'u' << 8) | 'l', ('A' << 16) | ( 'u' << 8) | 'g',
- ('S' << 16) | ( 'e' << 8) | 'p', ('O' << 16) | ( 'c' << 8) | 't',
- ('N' << 16) | ( 'o' << 8) | 'v', ('D' << 16) | ( 'e' << 8) | 'c'};
- if (d == NULL) d = &x;
-
- d->tm_year = 0; /* bad date */
- comma = strchr(date,',') ;
- lday = (comma-date) ;
-
- if( lday >= 6 && lday <= 8) { /* RFC850 */
- date = comma - 3 ;
- if (!proxy_checkmask(date, "day, [EMAIL PROTECTED] ##:##:## GMT") &&
- !proxy_checkmask(date, "day, [EMAIL PROTECTED] ##:##:## GMT;*"))
return -1;
- } else { /* RFC1123 */
- if (!proxy_checkmask(date, "@$$, ## @$$ #### ##:##:## GMT") &&
- !proxy_checkmask(date, "@$$, ## @$$ #### ##:##:## GMT;*")) return
-1;
- }
-
- /* we don't test the weekday */
- d->tm_mday = (date[5] - '0') * 10 + (date[6] - '0');
- if (d->tm_mday == 0 || d->tm_mday > 31) return -1;
-
- mint = (date[8] << 16) | (date[9] << 8) | date[10];
- for (mon=0; mon < 12; mon++) if (mint == months[mon]) break;
- if (mon == 12) return -1;
-
- d->tm_mon = mon;
- if( lday >= 6 && lday <= 8) { /* RFC850 */
- year = 1900 + date[12] * 10 + date[13] - ('0' * 11) ;
- d->tm_hour = date[15] * 10 + date[16] - '0' * 11;
- d->tm_min = date[18] * 10 + date[19] - '0' * 11;
- d->tm_sec = date[21] * 10 + date[22] - '0' * 11;
- } else { /* RFC1123 */
- year = date[12] * 1000 + date[13] * 100 + date[14] * 10 + date[15] -
- ('0' * 1111);
- d->tm_hour = date[17] * 10 + date[18] - '0' * 11;
- d->tm_min = date[20] * 10 + date[21] - '0' * 11;
- d->tm_sec = date[23] * 10 + date[24] - '0' * 11;
- }
-
- if (d->tm_hour > 23 || d->tm_min > 59 || d->tm_sec > 61) return -1;
-
- if (d->tm_mday == 31 && (mon == 1 || mon == 3 || mon == 5 || mon == 8 ||
- mon == 10)) return -1;
- if (d->tm_mday > 29 && mon == 1) return -1;
- if (d->tm_mday == 29 && mon == 1)
- if (year%4 != 0 || (year%100 == 0 && year%400 != 0)) return -1;
-
- d->tm_year = year - 1900;
- d->tm_isdst = 0;
- return proxy_tm2sec(d);
}
/*
--- 575,580 ----