Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_ra_serf/util.c view on Meta::CPAN
{
svn_ra_serf__server_error_t *server_err;
server_err = apr_pcalloc(result_pool, sizeof(*server_err));
server_err->error = svn_error_create(APR_SUCCESS, NULL, NULL);
server_err->contains_precondition_error = FALSE;
server_err->cdata = svn_stringbuf_create_empty(server_err->error->pool);
server_err->collect_cdata = FALSE;
server_err->parser.pool = server_err->error->pool;
server_err->parser.user_data = server_err;
server_err->parser.start = start;
server_err->parser.end = end;
server_err->parser.cdata = cdata;
server_err->parser.ignore_errors = TRUE;
return server_err;
}
/* Implements svn_ra_serf__response_handler_t */
svn_error_t *
svn_ra_serf__handle_discard_body(serf_request_t *request,
serf_bucket_t *response,
void *baton,
apr_pool_t *pool)
{
apr_status_t status;
status = drain_bucket(response);
if (status)
return svn_ra_serf__wrap_err(status, NULL);
return SVN_NO_ERROR;
}
apr_status_t
svn_ra_serf__response_discard_handler(serf_request_t *request,
serf_bucket_t *response,
void *baton,
apr_pool_t *pool)
{
return drain_bucket(response);
}
/* Return the value of the RESPONSE's Location header if any, or NULL
otherwise. */
static const char *
response_get_location(serf_bucket_t *response,
const char *base_url,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
serf_bucket_t *headers;
const char *location;
headers = serf_bucket_response_get_headers(response);
location = serf_bucket_headers_get(headers, "Location");
if (location == NULL)
return NULL;
/* The RFCs say we should have received a full url in LOCATION, but
older apache versions and many custom web handlers just return a
relative path here...
And we can't trust anything because it is network data.
*/
if (*location == '/')
{
apr_uri_t uri;
apr_status_t status;
status = apr_uri_parse(scratch_pool, base_url, &uri);
if (status != APR_SUCCESS)
return NULL;
/* Replace the path path with what we got */
uri.path = (char*)svn_urlpath__canonicalize(location, scratch_pool);
/* And make APR produce a proper full url for us */
location = apr_uri_unparse(scratch_pool, &uri, 0);
/* Fall through to ensure our canonicalization rules */
}
else if (!svn_path_is_url(location))
{
return NULL; /* Any other formats we should support? */
}
return svn_uri_canonicalize(location, result_pool);
}
/* Implements svn_ra_serf__response_handler_t */
svn_error_t *
svn_ra_serf__expect_empty_body(serf_request_t *request,
serf_bucket_t *response,
void *baton,
apr_pool_t *scratch_pool)
{
svn_ra_serf__handler_t *handler = baton;
serf_bucket_t *hdrs;
const char *val;
/* This function is just like handle_multistatus_only() except for the
XML parsing callbacks. We want to look for the human-readable element. */
/* We should see this just once, in order to initialize SERVER_ERROR.
At that point, the core error processing will take over. If we choose
not to parse an error, then we'll never return here (because we
change the response handler). */
SVN_ERR_ASSERT(handler->server_error == NULL);
hdrs = serf_bucket_response_get_headers(response);
val = serf_bucket_headers_get(hdrs, "Content-Type");
if (val && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
{
svn_ra_serf__server_error_t *server_err;
server_err = begin_error_parsing(start_error, end_error, cdata_error,
handler->handler_pool);
( run in 0.765 second using v1.01-cache-2.11-cpan-483215c6ad5 )