Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_ra_serf/util.c view on Meta::CPAN
serf_bucket_t *body_bkt, const char *content_type,
const char *accept_encoding,
apr_pool_t *request_pool,
apr_pool_t *scratch_pool)
{
serf_bucket_alloc_t *allocator = serf_request_get_alloc(request);
svn_spillbuf_t *buf;
svn_boolean_t set_CL = session->http10 || !session->using_chunked_requests;
if (set_CL && body_bkt != NULL)
{
/* Ugh. Use HTTP/1.0 to talk to the server because we don't know if
it speaks HTTP/1.1 (and thus, chunked requests), or because the
server actually responded as only supporting HTTP/1.0.
We'll take the existing body_bkt, spool it into a spillbuf, and
then wrap a bucket around that spillbuf. The spillbuf will give
us the Content-Length value. */
SVN_ERR(svn_ra_serf__copy_into_spillbuf(&buf, body_bkt,
request_pool,
scratch_pool));
/* Destroy original bucket since it content is already copied
to spillbuf. */
serf_bucket_destroy(body_bkt);
body_bkt = svn_ra_serf__create_sb_bucket(buf, allocator,
request_pool,
scratch_pool);
}
/* Create a request bucket. Note that this sucker is kind enough to
add a "Host" header for us. */
*req_bkt = serf_request_bucket_request_create(request, method, url,
body_bkt, allocator);
/* Set the Content-Length value. This will also trigger an HTTP/1.0
request (rather than the default chunked request). */
if (set_CL)
{
if (body_bkt == NULL)
serf_bucket_request_set_CL(*req_bkt, 0);
else
serf_bucket_request_set_CL(*req_bkt, svn_spillbuf__get_size(buf));
}
*hdrs_bkt = serf_bucket_request_get_headers(*req_bkt);
/* We use serf_bucket_headers_setn() because the USERAGENT has a
lifetime longer than this bucket. Thus, there is no need to copy
the header values. */
serf_bucket_headers_setn(*hdrs_bkt, "User-Agent", session->useragent);
if (content_type)
{
serf_bucket_headers_setn(*hdrs_bkt, "Content-Type", content_type);
}
if (session->http10)
{
serf_bucket_headers_setn(*hdrs_bkt, "Connection", "keep-alive");
}
if (accept_encoding)
{
serf_bucket_headers_setn(*hdrs_bkt, "Accept-Encoding", accept_encoding);
}
/* These headers need to be sent with every request; see issue #3255
("mod_dav_svn does not pass client capabilities to start-commit
hooks") for why. */
serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_DEPTH);
serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_MERGEINFO);
serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_LOG_REVPROPS);
return SVN_NO_ERROR;
}
svn_error_t *
svn_ra_serf__context_run_wait(svn_boolean_t *done,
svn_ra_serf__session_t *sess,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool;
apr_interval_time_t waittime_left = sess->timeout;
assert(sess->pending_error == SVN_NO_ERROR);
iterpool = svn_pool_create(scratch_pool);
while (!*done)
{
apr_status_t status;
svn_error_t *err;
int i;
svn_pool_clear(iterpool);
if (sess->cancel_func)
SVN_ERR((*sess->cancel_func)(sess->cancel_baton));
status = serf_context_run(sess->context,
SVN_RA_SERF__CONTEXT_RUN_DURATION,
iterpool);
err = sess->pending_error;
sess->pending_error = SVN_NO_ERROR;
/* If the context duration timeout is up, we'll subtract that
duration from the total time alloted for such things. If
there's no time left, we fail with a message indicating that
the connection timed out. */
if (APR_STATUS_IS_TIMEUP(status))
{
status = 0;
if (sess->timeout)
{
if (waittime_left > SVN_RA_SERF__CONTEXT_RUN_DURATION)
{
waittime_left -= SVN_RA_SERF__CONTEXT_RUN_DURATION;
}
( run in 0.654 second using v1.01-cache-2.11-cpan-df04353d9ac )