diff options
Diffstat (limited to 'subversion/mod_dav_svn/dav_svn.h')
-rw-r--r-- | subversion/mod_dav_svn/dav_svn.h | 97 |
1 files changed, 70 insertions, 27 deletions
diff --git a/subversion/mod_dav_svn/dav_svn.h b/subversion/mod_dav_svn/dav_svn.h index 8786518..9d11a0a 100644 --- a/subversion/mod_dav_svn/dav_svn.h +++ b/subversion/mod_dav_svn/dav_svn.h @@ -54,7 +54,7 @@ extern "C" { /* Option values for SVNAllowBulkUpdates. Note that it's important that CONF_BULKUPD_DEFAULT is 0 to make - dav_svn_merge_dir_config do the right thing. */ + merge_dir_config in mod_dav_svn do the right thing. */ typedef enum dav_svn__bulk_upd_conf { CONF_BULKUPD_DEFAULT, CONF_BULKUPD_ON, @@ -329,6 +329,10 @@ svn_boolean_t dav_svn__get_fulltext_cache_flag(request_rec *r); /* for the repository referred to by this request, is revprop caching active? */ svn_boolean_t dav_svn__get_revprop_cache_flag(request_rec *r); +/* has block read mode been enabled for the repository referred to by this + * request? */ +svn_boolean_t dav_svn__get_block_read_flag(request_rec *r); + /* for the repository referred to by this request, are subrequests bypassed? * A function pointer if yes, NULL if not. */ @@ -442,6 +446,40 @@ const char *dav_svn__get_vtxn_stub(request_rec *r); /* For accessing transaction properties (typically "!svn/vtxr") */ const char *dav_svn__get_vtxn_root_stub(request_rec *r); + +/*** Output helpers ***/ + +/* An opaque type which represents an output for a particular request. + + All writes should target a dav_svn__output object by either using + the dav_svn__brigade functions or by preparing a bucket brigade and + passing it to the output with dav_svn__output_pass_brigade(). + + IMPORTANT: Don't write to an ap_filter_t coming from mod_dav, and + use this wrapper and the corresponding private API instead. Using + the ap_filter_t can cause unbounded memory usage with self-removing + output filters (e.g., with the filters installed by mod_headers or + mod_deflate). + + See https://mail-archives.apache.org/mod_mbox/httpd-dev/201608.mbox/%3C20160822151917.GA22369%40redhat.com%3E +*/ +typedef struct dav_svn__output dav_svn__output; + +/* Create the output wrapper for request R, allocated in POOL. */ +dav_svn__output * +dav_svn__output_create(request_rec *r, + apr_pool_t *pool); + +/* Get a bucket allocator to use for all bucket/brigade creations + when writing to OUTPUT. */ +apr_bucket_alloc_t * +dav_svn__output_get_bucket_alloc(dav_svn__output *output); + +/* Pass the bucket brigade BB down to the OUTPUT's filter stack. */ +svn_error_t * +dav_svn__output_pass_brigade(dav_svn__output *output, + apr_bucket_brigade *bb); + /*** activity.c ***/ @@ -482,6 +520,8 @@ dav_svn__store_activity(const dav_svn_repos *repos, /* POST request handler. (Used by HTTP protocol v2 clients only.) */ int dav_svn__method_post(request_rec *r); +/* Request handler to GET Subversion internal status (FSFS cache). */ +int dav_svn__status(request_rec *r); /*** repos.c ***/ @@ -628,7 +668,7 @@ dav_svn__insert_all_liveprops(request_rec *r, /* Generate the HTTP response body for a successful MERGE. */ /* ### more docco */ dav_error * -dav_svn__merge_response(ap_filter_t *output, +dav_svn__merge_response(dav_svn__output *output, const dav_svn_repos *repos, svn_revnum_t new_rev, const char *post_commit_err, @@ -662,49 +702,49 @@ static const dav_report_elem dav_svn__reports_list[] = { dav_error * dav_svn__update_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__log_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__dated_rev_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_locations_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_location_segments_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__file_revs_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__replay_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_mergeinfo_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_locks_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_deleted_rev_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__get_inherited_props_report(const dav_resource *resource, const apr_xml_doc *doc, - ap_filter_t *output); + dav_svn__output *output); /*** posts/ ***/ @@ -712,11 +752,11 @@ dav_svn__get_inherited_props_report(const dav_resource *resource, dav_error * dav_svn__post_create_txn(const dav_resource *resource, svn_skel_t *request_skel, - ap_filter_t *output); + dav_svn__output *output); dav_error * dav_svn__post_create_txn_with_props(const dav_resource *resource, svn_skel_t *request_skel, - ap_filter_t *output); + dav_svn__output *output); /*** authz.c ***/ @@ -792,12 +832,10 @@ dav_svn__authz_read_func(dav_svn__authz_read_baton *baton); default value for the error code. */ dav_error * -dav_svn__new_error_tag(apr_pool_t *pool, +dav_svn__new_error_svn(apr_pool_t *pool, int status, int error_id, - const char *desc, - const char *namespace, - const char *tagname); + const char *desc); /* A wrapper around mod_dav's dav_new_error, mod_dav_svn uses this @@ -878,7 +916,7 @@ dav_svn__build_uri(const dav_svn_repos *repos, enum dav_svn__build_what what, svn_revnum_t revision, const char *path, - int add_href, + svn_boolean_t add_href, apr_pool_t *pool); @@ -918,23 +956,28 @@ int dav_svn__find_ns(const apr_array_header_t *namespaces, const char *uri); /* Write LEN bytes from DATA to OUTPUT using BB. */ svn_error_t *dav_svn__brigade_write(apr_bucket_brigade *bb, - ap_filter_t *output, + dav_svn__output *output, const char *buf, apr_size_t len); /* Write NULL-terminated string STR to OUTPUT using BB. */ svn_error_t *dav_svn__brigade_puts(apr_bucket_brigade *bb, - ap_filter_t *output, + dav_svn__output *output, const char *str); /* Write data to OUTPUT using BB, using FMT as the output format string. */ svn_error_t *dav_svn__brigade_printf(apr_bucket_brigade *bb, - ap_filter_t *output, + dav_svn__output *output, const char *fmt, ...) __attribute__((format(printf, 3, 4))); +/* Write an unspecified number of strings to OUTPUT using BB. */ +svn_error_t *dav_svn__brigade_putstrs(apr_bucket_brigade *bb, + dav_svn__output *output, + ...) SVN_NEEDS_SENTINEL_NULL; + @@ -968,11 +1011,10 @@ dav_svn__sanitize_error(svn_error_t *serr, /* Return a writable generic stream that will encode its output to base64 - and send it to the Apache filter OUTPUT using BB. Allocate the stream in - POOL. */ + and send it to OUTPUT using BB. Allocate the stream in POOL. */ svn_stream_t * dav_svn__make_base64_output_stream(apr_bucket_brigade *bb, - ap_filter_t *output, + dav_svn__output *output, apr_pool_t *pool); /* In INFO->r->subprocess_env set "SVN-ACTION" to LINE, "SVN-REPOS" to @@ -1014,7 +1056,8 @@ dav_svn__operational_log(struct dav_resource_private *info, const char *line); */ dav_error * dav_svn__final_flush_or_error(request_rec *r, apr_bucket_brigade *bb, - ap_filter_t *output, dav_error *preferred_err, + dav_svn__output *output, + dav_error *preferred_err, apr_pool_t *pool); /* Log a DAV error response. |