/* * options.c : routines for performing OPTIONS server requests * * ==================================================================== * Copyright (c) 2000-2004 CollabNet. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://subversion.tigris.org/license-1.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * * This software consists of voluntary contributions made by many * individuals. For exact contribution history, see the revision * history and logs, available at http://subversion.tigris.org/. * ==================================================================== */ #include #include #include #include "svn_error.h" #include "svn_private_config.h" #include "ra_dav.h" static const svn_ra_dav__xml_elm_t options_elements[] = { { "DAV:", "activity-collection-set", ELEM_activity_coll_set, 0 }, { "DAV:", "href", ELEM_href, SVN_RA_DAV__XML_CDATA }, { "DAV:", "options-response", ELEM_options_response, 0 }, { NULL } }; typedef struct { const svn_string_t *activity_coll; apr_pool_t *pool; } options_ctx_t; static int validate_element(void *userdata, svn_ra_dav__xml_elmid parent, svn_ra_dav__xml_elmid child) { switch (parent) { case ELEM_root: if (child == ELEM_options_response) return SVN_RA_DAV__XML_VALID; else return SVN_RA_DAV__XML_INVALID; case ELEM_options_response: if (child == ELEM_activity_coll_set) return SVN_RA_DAV__XML_VALID; else return SVN_RA_DAV__XML_DECLINE; /* not concerned with other response */ case ELEM_activity_coll_set: if (child == ELEM_href) return SVN_RA_DAV__XML_VALID; else return SVN_RA_DAV__XML_DECLINE; /* not concerned with unknown crud */ default: return SVN_RA_DAV__XML_DECLINE; } /* NOTREACHED */ } static int start_element(void *userdata, const svn_ra_dav__xml_elm_t *elm, const char **atts) { /* nothing to do here */ return SVN_RA_DAV__XML_VALID; } static int end_element(void *userdata, const svn_ra_dav__xml_elm_t *elm, const char *cdata) { options_ctx_t *oc = userdata; if (elm->id == ELEM_href) { oc->activity_coll = svn_string_create(cdata, oc->pool); } return SVN_RA_DAV__XML_VALID; } svn_error_t * svn_ra_dav__get_activity_collection( const svn_string_t **activity_coll, svn_ra_dav__session_t *ras, const char *url, apr_pool_t *pool) { options_ctx_t oc = { 0 }; #if 0 ne_add_response_header_handler(req, "dav", ne_duplicate_header, &dav_header); #endif oc.pool = pool; SVN_ERR(svn_ra_dav__parsed_request_compat(ras->sess, "OPTIONS", url, "" "" "" "", 0, NULL, options_elements, validate_element, start_element, end_element, &oc, NULL, NULL, FALSE, pool)); if (oc.activity_coll == NULL) { /* ### error */ return svn_error_create(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED, NULL, _("The OPTIONS response did not include the " "requested activity-collection-set; " "this often means that " "the URL is not WebDAV-enabled")); } *activity_coll = oc.activity_coll; return SVN_NO_ERROR; }