]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/rfc1123.c
3 * $Id: rfc1123.c,v 1.41 2007/12/06 02:37:15 amosjeffries Exp $
6 * AUTHOR: Harvest Derived
8 * SQUID Web Proxy Cache http://www.squid-cache.org/
9 * ----------------------------------------------------------
11 * Squid is the result of efforts by numerous individuals from
12 * the Internet community; see the CONTRIBUTORS file for full
13 * details. Many organizations have provided support for Squid's
14 * development; see the SPONSORS file for full details. Squid is
15 * Copyrighted (C) 2001 by the Regents of the University of
16 * California; see the COPYRIGHT file for full details. Squid
17 * incorporates software developed and/or copyrighted by other
18 * sources; see the CREDITS file for full details.
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
40 * Adapted from HTSUtils.c in CERN httpd 3.0 (http://info.cern.ch/httpd/)
41 * by Darren Hardy <hardy@cs.colorado.edu>, November 1994.
56 #include <sys/types.h>
68 #define RFC850_STRFTIME "%A, %d-%b-%y %H:%M:%S GMT"
69 #define RFC1123_STRFTIME "%a, %d %b %Y %H:%M:%S GMT"
71 static int make_month(const char *s
);
72 static int make_num(const char *s
);
74 static const char *month_names
[12] = {
75 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
76 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
81 make_num(const char *s
)
83 if (*s
>= '0' && *s
<= '9')
84 return 10 * (*s
- '0') + *(s
+ 1) - '0';
86 return *(s
+ 1) - '0';
90 make_month(const char *s
)
95 month
[0] = xtoupper(*s
);
96 month
[1] = xtolower(*(s
+ 1));
97 month
[2] = xtolower(*(s
+ 2));
99 for (i
= 0; i
< 12; i
++)
100 if (!strncmp(month_names
[i
], month
, 3))
106 tmSaneValues(struct tm
*tm
)
108 if (tm
->tm_sec
< 0 || tm
->tm_sec
> 59)
110 if (tm
->tm_min
< 0 || tm
->tm_min
> 59)
112 if (tm
->tm_hour
< 0 || tm
->tm_hour
> 23)
114 if (tm
->tm_mday
< 1 || tm
->tm_mday
> 31)
116 if (tm
->tm_mon
< 0 || tm
->tm_mon
> 11)
122 parse_date_elements(const char *day
, const char *month
, const char *year
,
123 const char *time
, const char *zone
) {
126 memset(&tm
, 0, sizeof(tm
));
128 if (!day
|| !month
|| !year
|| !time
)
130 tm
.tm_mday
= atoi(day
);
131 tm
.tm_mon
= make_month(month
);
134 tm
.tm_year
= atoi(year
);
135 if (strlen(year
) == 4)
137 else if (tm
.tm_year
< 70)
139 else if (tm
.tm_year
> 19000)
141 tm
.tm_hour
= make_num(time
);
142 t
= strchr(time
, ':');
149 tm
.tm_sec
= atoi(t
+ 1);
150 return tmSaneValues(&tm
) ? &tm
: NULL
;
154 parse_date(const char *str
) {
165 xstrncpy(tmp
, str
, 64);
167 for (t
= strtok(tmp
, ", "); t
; t
= strtok(NULL
, ", ")) {
181 } else if (strchr(t
, ':'))
192 tm
= parse_date_elements(day
, month
, year
, time
, zone
);
198 parse_rfc1123(const char *str
)
204 tm
= parse_date(str
);
210 #elif HAVE_TM_TM_GMTOFF
213 struct tm
*local
= localtime(&t
);
214 t
+= local
->tm_gmtoff
;
217 /* some systems do not have tm_gmtoff so we fake it */
221 #if defined (_TIMEZONE)
222 #elif defined (_timezone)
223 #elif defined(_SQUID_AIX_)
224 #elif defined(_SQUID_CYGWIN_)
225 #elif defined(_SQUID_MSWIN_)
226 #elif defined(_SQUID_SGI_)
228 extern long timezone
;
231 * The following assumes a fixed DST offset of 1 hour,
232 * which is probably wrong.
234 if (tm
->tm_isdst
> 0)
236 #if defined ( _timezone) || defined(_SQUID_WIN32_)
237 t
-= (_timezone
+ dst
);
239 t
-= (timezone
+ dst
);
249 static char buf
[128];
251 struct tm
*gmt
= gmtime(&t
);
254 strftime(buf
, 127, RFC1123_STRFTIME
, gmt
);
259 mkhttpdlogtime(const time_t * t
)
261 static char buf
[128];
263 struct tm
*gmt
= gmtime(t
);
266 int gmt_min
, gmt_hour
, gmt_yday
, day_offset
;
271 /* localtime & gmtime may use the same static data */
272 gmt_min
= gmt
->tm_min
;
273 gmt_hour
= gmt
->tm_hour
;
274 gmt_yday
= gmt
->tm_yday
;
278 day_offset
= lt
->tm_yday
- gmt_yday
;
279 /* wrap round on end of year */
282 else if (day_offset
< -1)
285 min_offset
= day_offset
* 1440 + (lt
->tm_hour
- gmt_hour
) * 60
286 + (lt
->tm_min
- gmt_min
);
288 len
= strftime(buf
, 127 - 5, "%d/%b/%Y:%H:%M:%S ", lt
);
289 snprintf(buf
+ len
, 128 - len
, "%+03d%02d",
290 (min_offset
/ 60) % 24,
294 strftime(buf
, 127, "%d/%b/%Y:%H:%M:%S -000", gmt
);
309 printf("HTTP Time: %s\n", x
);
311 pt
= parse_rfc1123(x
);
312 printf("Parsed: %d vs. %d\n", pt
, t
);