base
This commit is contained in:
+100
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
WebDAV 207 multi-status response handling
|
||||
Copyright (C) 1999-2004, Joe Orton <joe@manyfish.co.uk>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
#ifndef DAV207_H
|
||||
#define DAV207_H
|
||||
|
||||
#include "ne_xml.h"
|
||||
#include "ne_request.h" /* for ne_request */
|
||||
|
||||
BEGIN_NEON_DECLS
|
||||
|
||||
/* The defined state integer for the '{DAV:}prop' element. */
|
||||
#define NE_207_STATE_PROP (50)
|
||||
/* This interface reserves the state integers 'x' where 0 < x < 100 */
|
||||
#define NE_207_STATE_TOP (100)
|
||||
|
||||
/* Handling of 207 multistatus XML documents. A "multistatus"
|
||||
* document is made up of a set of responses, each concerned with a
|
||||
* particular resource. Each response may have an associated result
|
||||
* status and failure description. A response is made up of a set of
|
||||
* propstats, each of which again may have an associated result status
|
||||
* and failure description. */
|
||||
|
||||
/* Start and end response callbacks trigger at the start and end of
|
||||
* each "response" within the multistatus body. 'href' gives the URI
|
||||
* of the resource which is subject of this response. The return
|
||||
* value of a 'start_response' callback is passed as the 'response'
|
||||
* parameter to the corresponding 'end_response' parameter. */
|
||||
typedef void *ne_207_start_response(void *userdata, const char *href);
|
||||
typedef void ne_207_end_response(void *userdata, void *response,
|
||||
const ne_status *status,
|
||||
const char *description);
|
||||
|
||||
/* Similarly, start and end callbacks for each propstat within the
|
||||
* response. The return value of the 'start_response' callback for
|
||||
* the response in which this propstat is contains is passed as the
|
||||
* 'response' parameter. The return value of each 'start_propstat' is
|
||||
* passed as the 'propstat' parameter' to the corresponding
|
||||
* 'end_propstat' callback. If the start_propstat callback returns
|
||||
* NULL, parsing is aborted (the XML parser error must be set by the
|
||||
* callback). */
|
||||
typedef void *ne_207_start_propstat(void *userdata, void *response);
|
||||
typedef void ne_207_end_propstat(void *userdata, void *propstat,
|
||||
const ne_status *status,
|
||||
const char *description);
|
||||
|
||||
typedef struct ne_207_parser_s ne_207_parser;
|
||||
|
||||
/* Create 207 parser an add the handlers the the given parser's
|
||||
* handler stack. */
|
||||
ne_207_parser *ne_207_create(ne_xml_parser *parser, void *userdata);
|
||||
|
||||
/* Register response handling callbacks. */
|
||||
void ne_207_set_response_handlers(ne_207_parser *p,
|
||||
ne_207_start_response *start,
|
||||
ne_207_end_response *end);
|
||||
|
||||
/* Register propstat handling callbacks. */
|
||||
void ne_207_set_propstat_handlers(ne_207_parser *p,
|
||||
ne_207_start_propstat *start,
|
||||
ne_207_end_propstat *end);
|
||||
|
||||
/* Destroy the parser */
|
||||
void ne_207_destroy(ne_207_parser *p);
|
||||
|
||||
/* An acceptance function which only accepts 207 responses */
|
||||
int ne_accept_207(void *userdata, ne_request *req, const ne_status *status);
|
||||
|
||||
void *ne_207_get_current_propstat(ne_207_parser *p);
|
||||
void *ne_207_get_current_response(ne_207_parser *p);
|
||||
|
||||
/* Dispatch request 'req', returning:
|
||||
* NE_ERROR: for a dispatch error, or a non-2xx response, or a
|
||||
* 207 response which contained a non-2xx propstat
|
||||
* NE_OK: for a 2xx response or a 207 response which contained
|
||||
* only 2xx-class propstats.
|
||||
* The request object is destroyed in both cases. */
|
||||
int ne_simple_request(ne_session *sess, ne_request *req);
|
||||
|
||||
END_NEON_DECLS
|
||||
|
||||
#endif /* DAV207_H */
|
||||
+248
@@ -0,0 +1,248 @@
|
||||
/*
|
||||
Date manipulation routines
|
||||
Copyright (C) 1999-2005, Joe Orton <joe@manyfish.co.uk>
|
||||
Copyright (C) 2004 Jiang Lei <tristone@deluxe.ocn.ne.jp>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <time.h>
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h> /* for TIME_ZONE_INFORMATION */
|
||||
#endif
|
||||
|
||||
#include "ne_alloc.h"
|
||||
#include "ne_dates.h"
|
||||
#include "ne_string.h"
|
||||
|
||||
/* Generic date manipulation routines. */
|
||||
|
||||
/* ISO8601: 2001-01-01T12:30:00Z */
|
||||
#define ISO8601_FORMAT_Z "%04d-%02d-%02dT%02d:%02d:%lfZ"
|
||||
#define ISO8601_FORMAT_M "%04d-%02d-%02dT%02d:%02d:%lf-%02d:%02d"
|
||||
#define ISO8601_FORMAT_P "%04d-%02d-%02dT%02d:%02d:%lf+%02d:%02d"
|
||||
|
||||
/* RFC1123: Sun, 06 Nov 1994 08:49:37 GMT */
|
||||
#define RFC1123_FORMAT "%3s, %02d %3s %4d %02d:%02d:%02d GMT"
|
||||
/* RFC850: Sunday, 06-Nov-94 08:49:37 GMT */
|
||||
#define RFC1036_FORMAT "%10s %2d-%3s-%2d %2d:%2d:%2d GMT"
|
||||
/* asctime: Wed Jun 30 21:49:08 1993 */
|
||||
#define ASCTIME_FORMAT "%3s %3s %2d %2d:%2d:%2d %4d"
|
||||
|
||||
static const char *const rfc1123_weekdays[7] = {
|
||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
||||
};
|
||||
static const char *const short_months[12] = {
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
};
|
||||
|
||||
#if defined(HAVE_STRUCT_TM_TM_GMTOFF)
|
||||
#define GMTOFF(t) ((t).tm_gmtoff)
|
||||
#elif defined(HAVE_STRUCT_TM___TM_GMTOFF)
|
||||
#define GMTOFF(t) ((t).__tm_gmtoff)
|
||||
#elif defined(WIN32)
|
||||
#define GMTOFF(t) (gmt_to_local_win32())
|
||||
#else
|
||||
/* FIXME: work out the offset anyway. */
|
||||
#define GMTOFF(t) (0)
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
time_t gmt_to_local_win32(void)
|
||||
{
|
||||
TIME_ZONE_INFORMATION tzinfo;
|
||||
DWORD dwStandardDaylight;
|
||||
long bias;
|
||||
|
||||
dwStandardDaylight = GetTimeZoneInformation(&tzinfo);
|
||||
bias = tzinfo.Bias;
|
||||
|
||||
if (dwStandardDaylight == TIME_ZONE_ID_STANDARD)
|
||||
bias += tzinfo.StandardBias;
|
||||
|
||||
if (dwStandardDaylight == TIME_ZONE_ID_DAYLIGHT)
|
||||
bias += tzinfo.DaylightBias;
|
||||
|
||||
return (- bias * 60);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Returns the time/date GMT, in RFC1123-type format: eg
|
||||
* Sun, 06 Nov 1994 08:49:37 GMT. */
|
||||
char *ne_rfc1123_date(time_t anytime) {
|
||||
struct tm *gmt;
|
||||
char *ret;
|
||||
gmt = gmtime(&anytime);
|
||||
if (gmt == NULL)
|
||||
return NULL;
|
||||
ret = ne_malloc(29 + 1); /* dates are 29 chars long */
|
||||
/* it goes: Sun, 06 Nov 1994 08:49:37 GMT */
|
||||
ne_snprintf(ret, 30, RFC1123_FORMAT,
|
||||
rfc1123_weekdays[gmt->tm_wday], gmt->tm_mday,
|
||||
short_months[gmt->tm_mon], 1900 + gmt->tm_year,
|
||||
gmt->tm_hour, gmt->tm_min, gmt->tm_sec);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Takes an ISO-8601-formatted date string and returns the time_t.
|
||||
* Returns (time_t)-1 if the parse fails. */
|
||||
time_t ne_iso8601_parse(const char *date)
|
||||
{
|
||||
struct tm gmt = {0};
|
||||
int off_hour, off_min;
|
||||
double sec;
|
||||
off_t fix;
|
||||
int n;
|
||||
|
||||
/* it goes: ISO8601: 2001-01-01T12:30:00+03:30 */
|
||||
if ((n = sscanf(date, ISO8601_FORMAT_P,
|
||||
&gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,
|
||||
&gmt.tm_hour, &gmt.tm_min, &sec,
|
||||
&off_hour, &off_min)) == 8) {
|
||||
gmt.tm_sec = (int)sec;
|
||||
fix = - off_hour * 3600 - off_min * 60;
|
||||
}
|
||||
/* it goes: ISO8601: 2001-01-01T12:30:00-03:30 */
|
||||
else if ((n = sscanf(date, ISO8601_FORMAT_M,
|
||||
&gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,
|
||||
&gmt.tm_hour, &gmt.tm_min, &sec,
|
||||
&off_hour, &off_min)) == 8) {
|
||||
gmt.tm_sec = (int)sec;
|
||||
fix = off_hour * 3600 + off_min * 60;
|
||||
}
|
||||
/* it goes: ISO8601: 2001-01-01T12:30:00Z */
|
||||
else if ((n = sscanf(date, ISO8601_FORMAT_Z,
|
||||
&gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,
|
||||
&gmt.tm_hour, &gmt.tm_min, &sec)) == 6) {
|
||||
gmt.tm_sec = (int)sec;
|
||||
fix = 0;
|
||||
}
|
||||
else {
|
||||
return (time_t)-1;
|
||||
}
|
||||
|
||||
gmt.tm_year -= 1900;
|
||||
gmt.tm_isdst = -1;
|
||||
gmt.tm_mon--;
|
||||
|
||||
return mktime(&gmt) + fix + GMTOFF(gmt);
|
||||
}
|
||||
|
||||
/* Takes an RFC1123-formatted date string and returns the time_t.
|
||||
* Returns (time_t)-1 if the parse fails. */
|
||||
time_t ne_rfc1123_parse(const char *date)
|
||||
{
|
||||
struct tm gmt = {0};
|
||||
char wkday[4], mon[4];
|
||||
int n;
|
||||
/* it goes: Sun, 06 Nov 1994 08:49:37 GMT */
|
||||
n = sscanf(date, RFC1123_FORMAT,
|
||||
wkday, &gmt.tm_mday, mon, &gmt.tm_year, &gmt.tm_hour,
|
||||
&gmt.tm_min, &gmt.tm_sec);
|
||||
/* Is it portable to check n==7 here? */
|
||||
gmt.tm_year -= 1900;
|
||||
for (n=0; n<12; n++)
|
||||
if (strcmp(mon, short_months[n]) == 0)
|
||||
break;
|
||||
/* tm_mon comes out as 12 if the month is corrupt, which is desired,
|
||||
* since the mktime will then fail */
|
||||
gmt.tm_mon = n;
|
||||
gmt.tm_isdst = -1;
|
||||
return mktime(&gmt) + GMTOFF(gmt);
|
||||
}
|
||||
|
||||
/* Takes a string containing a RFC1036-style date and returns the time_t */
|
||||
time_t ne_rfc1036_parse(const char *date)
|
||||
{
|
||||
struct tm gmt = {0};
|
||||
int n;
|
||||
char wkday[11], mon[4];
|
||||
/* RFC850/1036 style dates: Sunday, 06-Nov-94 08:49:37 GMT */
|
||||
n = sscanf(date, RFC1036_FORMAT,
|
||||
wkday, &gmt.tm_mday, mon, &gmt.tm_year,
|
||||
&gmt.tm_hour, &gmt.tm_min, &gmt.tm_sec);
|
||||
if (n != 7) {
|
||||
return (time_t)-1;
|
||||
}
|
||||
|
||||
/* portable to check n here? */
|
||||
for (n=0; n<12; n++)
|
||||
if (strcmp(mon, short_months[n]) == 0)
|
||||
break;
|
||||
/* tm_mon comes out as 12 if the month is corrupt, which is desired,
|
||||
* since the mktime will then fail */
|
||||
|
||||
/* Defeat Y2K bug. */
|
||||
if (gmt.tm_year < 50)
|
||||
gmt.tm_year += 100;
|
||||
|
||||
gmt.tm_mon = n;
|
||||
gmt.tm_isdst = -1;
|
||||
return mktime(&gmt) + GMTOFF(gmt);
|
||||
}
|
||||
|
||||
|
||||
/* (as)ctime dates are like:
|
||||
* Wed Jun 30 21:49:08 1993
|
||||
*/
|
||||
time_t ne_asctime_parse(const char *date)
|
||||
{
|
||||
struct tm gmt = {0};
|
||||
int n;
|
||||
char wkday[4], mon[4];
|
||||
n = sscanf(date, ASCTIME_FORMAT,
|
||||
wkday, mon, &gmt.tm_mday,
|
||||
&gmt.tm_hour, &gmt.tm_min, &gmt.tm_sec,
|
||||
&gmt.tm_year);
|
||||
/* portable to check n here? */
|
||||
for (n=0; n<12; n++)
|
||||
if (strcmp(mon, short_months[n]) == 0)
|
||||
break;
|
||||
/* tm_mon comes out as 12 if the month is corrupt, which is desired,
|
||||
* since the mktime will then fail */
|
||||
gmt.tm_mon = n;
|
||||
gmt.tm_isdst = -1;
|
||||
return mktime(&gmt) + GMTOFF(gmt);
|
||||
}
|
||||
|
||||
/* HTTP-date parser */
|
||||
time_t ne_httpdate_parse(const char *date)
|
||||
{
|
||||
time_t tmp;
|
||||
tmp = ne_rfc1123_parse(date);
|
||||
if (tmp == -1) {
|
||||
tmp = ne_rfc1036_parse(date);
|
||||
if (tmp == -1)
|
||||
tmp = ne_asctime_parse(date);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
void *mxmalloc(size_t size);
|
||||
void *mxcalloc(size_t nmemb, size_t size);
|
||||
void *mxrealloc(void *ptr, size_t size);
|
||||
void mxfree( void *ptr, size_t size);
|
||||
Reference in New Issue
Block a user