33#define APR_WANT_STRFUNC
41#define AP_SUBST_MAX_LINE_LENGTH (1024*1024)
45module AP_MODULE_DECLARE_DATA substitute_module;
79 dcfg->max_line_length_set = 0;
80 dcfg->inherit_before = -1;
91 a->inherit_before = (
over->inherit_before != -1)
92 ?
over->inherit_before
93 :
base->inherit_before;
100 if (
a->inherit_before == 1) {
108 a->max_line_length =
over->max_line_length_set ?
109 over->max_line_length :
base->max_line_length;
110 a->max_line_length_set =
over->max_line_length_set
111 |
base->max_line_length_set;
115#define AP_MAX_BUCKETS 1000
117#define SEDRMPATBCKT(b, offset, tmp_b, patlen) do { \
118 apr_bucket_split(b, offset); \
119 tmp_b = APR_BUCKET_NEXT(b); \
120 apr_bucket_split(tmp_b, patlen); \
121 b = APR_BUCKET_NEXT(tmp_b); \
122 apr_bucket_delete(tmp_b); \
125#define CAP2LINEMAX(n) ((n) < (apr_size_t)200 ? (int)(n) : 200)
176 "Replacing %s:'%s' by '%s'",
177 script->pattern ?
"string" :
178 script->regexp ?
"regex" :
194 "Matching found, result: '%s'",
235 f->r->connection->bucket_alloc);
255 f->r->connection->bucket_alloc);
277 else if (
script->regexp) {
279 const char *pos =
buff;
296 if (
regm[0].rm_so > 0)
305 "Result: '%s'", vb.
buf);
324 f->r->connection->bucket_alloc);
327 "Result: '%s'",
repl);
333 pos +=
regm[0].rm_eo;
334 left -=
regm[0].rm_eo;
347 f->r->connection->bucket_alloc);
371 const char *nl =
NULL;
458 f->r->connection->bucket_alloc);
527 f->r->connection->bucket_alloc);
556 f->r->connection->bucket_alloc);
595 tmp_bb =
ctx->linebb;
596 ctx->linebb =
ctx->linesbb;
597 ctx->linesbb = tmp_bb;
623 return "Bad Substitute format, must be an s/// pattern";
648 if (!
delim || !from || !*from || !
to) {
649 return "Bad Substitute format, must be a complete s/// pattern";
657 else if (
delim ==
'n')
659 else if (
delim ==
'f')
661 else if (
delim ==
'q')
664 return "Bad Substitute flag, only s///[infq] are supported";
676 return "Substitute could not compile regex";
704#define GBYTE 1073741824
715 if ((*
end ==
'K' || *
end ==
'k') && !
end[1]) {
718 else if ((*
end ==
'M' || *
end ==
'm') && !
end[1]) {
721 else if ((*
end ==
'G' || *
end ==
'g') && !
end[1]) {
725 ((*
end !=
'B' && *
end !=
'b') ||
end[1])) {
732 return "SubstituteMaxLineLength must be a non-negative integer optionally "
733 "suffixed with 'b', 'k', 'm' or 'g'.";
736 dcfg->max_line_length_set = 1;
740#define PROTO_FLAGS AP_FILTER_PROTO_CHANGE|AP_FILTER_PROTO_CHANGE_LENGTH
749 "Pattern to filter the response content (s/foo/bar/[inf])"),
751 "Maximum line length"),
754 "Apply inherited patterns before those of the current context"),
#define AP_REG_DOLLAR_ENDONLY
#define AP_REG_NO_DEFAULT
const char apr_size_t len
APR-UTIL Buckets/Bucket Brigades.
APR Miscellaneous library routines.
APR general purpose library routines.
apr_size_t const unsigned char unsigned int unsigned int d
APR-UTIL string matching routines.
apr_array_append(apr_pool_t *p, const apr_array_header_t *first, const apr_array_header_t *second)
APR Standard Headers Support.
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_FLAG(directive, func, mconfig, where, help)
const char * ap_set_flag_slot(cmd_parms *cmd, void *struct_ptr, int arg)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
apr_status_t ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **save_to, apr_bucket_brigade **b, apr_pool_t *p)
ap_filter_rec_t * ap_register_output_filter(const char *name, ap_out_filter_func filter_func, ap_init_filter_func filter_init, ap_filter_type ftype)
void ap_varbuf_free(struct ap_varbuf *vb)
void ap_varbuf_strmemcat(struct ap_varbuf *vb, const char *str, int len)
apr_status_t ap_varbuf_regsub(struct ap_varbuf *vb, const char *input, const char *source, apr_size_t nmatch, ap_regmatch_t pmatch[], apr_size_t maxlen)
char * ap_varbuf_pdup(apr_pool_t *p, struct ap_varbuf *vb, const char *prepend, apr_size_t prepend_len, const char *append, apr_size_t append_len, apr_size_t *new_len)
void ap_varbuf_init(apr_pool_t *pool, struct ap_varbuf *vb, apr_size_t init_size)
#define APR_BUCKET_REMOVE(e)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define apr_bucket_split(e, point)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_CONCAT(a, b)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
apr_bucket apr_bucket_brigade * a
#define APR_BRIGADE_FIRST(b)
#define APR_BUCKET_INSERT_BEFORE(a, b)
#define apr_bucket_read(e, str, len, block)
const char apr_ssize_t int flags
#define apr_strmatch(pattern, s, slen)
#define STANDARD20_MODULE_STUFF
apr_status_t ap_pregsub_ex(apr_pool_t *p, char **result, const char *input, const char *source, apr_size_t nmatch, ap_regmatch_t pmatch[], apr_size_t maxlen)
ap_regex_t * ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags)
const char int apr_pool_t * pool
void * memchr(const void *s, int c, size_t n)
apr_interval_time_t apr_int32_t * num
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
const void apr_size_t bytes
apr_int32_t apr_int32_t apr_int32_t err
apr_size_t apr_size_t max
static char * substitute(char *buf, const int bufsize, const char *name, const char *replacement, const int do_esc)
static const command_rec substitute_cmds[]
static void register_hooks(apr_pool_t *pool)
static void * create_substitute_dcfg(apr_pool_t *p, char *d)
static void * merge_substitute_dcfg(apr_pool_t *p, void *basev, void *overv)
static apr_status_t substitute_filter(ap_filter_t *f, apr_bucket_brigade *bb)
static const char * set_pattern(cmd_parms *cmd, void *cfg, const char *line)
#define AP_SUBST_MAX_LINE_LENGTH
#define SEDRMPATBCKT(b, offset, tmp_b, patlen)
static apr_status_t do_pattmatch(ap_filter_t *f, apr_bucket *inb, apr_bucket_brigade *mybb, apr_pool_t *pool)
static const char substitute_filter_name[]
static const char * set_max_line_length(cmd_parms *cmd, void *cfg, const char *arg)
The representation of a filter chain.
apr_array_header_t * patterns
apr_size_t max_line_length
const ap_regex_t * regexp
const apr_strmatch_pattern * pattern
apr_bucket_brigade * linesbb
apr_bucket_brigade * pattbb
apr_bucket_brigade * passbb
apr_bucket_brigade * linebb
static struct pattern_s patterns[]
Apache resizable variable length buffer library.