📄 util_filter.h
字号:
/**
* Get the current bucket brigade from the next filter on the filter
* stack. The filter returns an apr_status_t value. If the bottom-most
* filter doesn't read from the network, then ::AP_NOBODY_READ is returned.
* The bucket brigade will be empty when there is nothing left to get.
* @param filter The next filter in the chain
* @param bucket The current bucket brigade. The original brigade passed
* to ap_get_brigade() must be empty.
* @param mode The way in which the data should be read
* @param block How the operations should be performed
* ::APR_BLOCK_READ, ::APR_NONBLOCK_READ
* @param readbytes How many bytes to read from the next filter.
*/
AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter,
apr_bucket_brigade *bucket,
ap_input_mode_t mode,
apr_read_type_e block,
apr_off_t readbytes);
/**
* Pass the current bucket brigade down to the next filter on the filter
* stack. The filter returns an apr_status_t value. If the bottom-most
* filter doesn't write to the network, then ::AP_NOBODY_WROTE is returned.
* The caller relinquishes ownership of the brigade.
* @param filter The next filter in the chain
* @param bucket The current bucket brigade
*/
AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter,
apr_bucket_brigade *bucket);
/**
* This function is used to register an input filter with the system.
* After this registration is performed, then a filter may be added
* into the filter chain by using ap_add_input_filter() and simply
* specifying the name.
*
* @param name The name to attach to the filter function
* @param filter_func The filter function to name
* @param filter_init The function to call before the filter handlers
are invoked
* @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or
* ::AP_FTYPE_CONNECTION
* @see add_input_filter()
*/
AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name,
ap_in_filter_func filter_func,
ap_init_filter_func filter_init,
ap_filter_type ftype);
/**
* This function is used to register an output filter with the system.
* After this registration is performed, then a filter may be added
* into the filter chain by using ap_add_output_filter() and simply
* specifying the name.
*
* @param name The name to attach to the filter function
* @param filter_func The filter function to name
* @param filter_init The function to call before the filter handlers
* are invoked
* @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or
* ::AP_FTYPE_CONNECTION
* @see ap_add_output_filter()
*/
AP_DECLARE(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);
/**
* Adds a named filter into the filter chain on the specified request record.
* The filter will be installed with the specified context pointer.
*
* Filters added in this way will always be placed at the end of the filters
* that have the same type (thus, the filters have the same order as the
* calls to ap_add_filter). If the current filter chain contains filters
* from another request, then this filter will be added before those other
* filters.
*
* To re-iterate that last comment. This function is building a FIFO
* list of filters. Take note of that when adding your filter to the chain.
*
* @param name The name of the filter to add
* @param ctx Context data to provide to the filter
* @param r The request to add this filter for (or NULL if it isn't associated with a request)
* @param c The connection to add the fillter for
*/
AP_DECLARE(ap_filter_t *) ap_add_input_filter(const char *name, void *ctx,
request_rec *r, conn_rec *c);
/**
* Variant of ap_add_input_filter() that accepts a registered filter handle
* (as returned by ap_register_input_filter()) rather than a filter name
*
* @param f The filter handle to add
* @param ctx Context data to provide to the filter
* @param r The request to add this filter for (or NULL if it isn't associated with a request)
* @param c The connection to add the fillter for
*/
AP_DECLARE(ap_filter_t *) ap_add_input_filter_handle(ap_filter_rec_t *f,
void *ctx,
request_rec *r,
conn_rec *c);
/**
* Returns the filter handle for use with ap_add_input_filter_handle.
*
* @param name The filter name to look up
*/
AP_DECLARE(ap_filter_rec_t *) ap_get_input_filter_handle(const char *name);
/**
* Add a filter to the current request. Filters are added in a FIFO manner.
* The first filter added will be the first filter called.
* @param name The name of the filter to add
* @param ctx Context data to set in the filter
* @param r The request to add this filter for (or NULL if it isn't associated with a request)
* @param c The connection to add this filter for
*/
AP_DECLARE(ap_filter_t *) ap_add_output_filter(const char *name, void *ctx,
request_rec *r, conn_rec *c);
/**
* Variant of ap_add_output_filter() that accepts a registered filter handle
* (as returned by ap_register_output_filter()) rather than a filter name
*
* @param f The filter handle to add
* @param r The request to add this filter for (or NULL if it isn't associated with a request)
* @param c The connection to add the fillter for
*/
AP_DECLARE(ap_filter_t *) ap_add_output_filter_handle(ap_filter_rec_t *f,
void *ctx,
request_rec *r,
conn_rec *c);
/**
* Returns the filter handle for use with ap_add_output_filter_handle.
*
* @param name The filter name to look up
*/
AP_DECLARE(ap_filter_rec_t *) ap_get_output_filter_handle(const char *name);
/**
* Remove an input filter from either the request or connection stack
* it is associated with.
* @param f The filter to remove
*/
AP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f);
/**
* Remove an output filter from either the request or connection stack
* it is associated with.
* @param f The filter to remove
*/
AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f);
/* The next two filters are for abstraction purposes only. They could be
* done away with, but that would require that we break modules if we ever
* want to change our filter registration method. The basic idea, is that
* all filters have a place to store data, the ctx pointer. These functions
* fill out that pointer with a bucket brigade, and retrieve that data on
* the next call. The nice thing about these functions, is that they
* automatically concatenate the bucket brigades together for you. This means
* that if you have already stored a brigade in the filters ctx pointer, then
* when you add more it will be tacked onto the end of that brigade. When
* you retrieve data, if you pass in a bucket brigade to the get function,
* it will append the current brigade onto the one that you are retrieving.
*/
/**
* prepare a bucket brigade to be setaside. If a different brigade was
* set-aside earlier, then the two brigades are concatenated together.
* @param f The current filter
* @param save_to The brigade that was previously set-aside. Regardless, the
* new bucket brigade is returned in this location.
* @param b The bucket brigade to save aside. This brigade is always empty
* on return
* @param p Ensure that all data in the brigade lives as long as this pool
*/
AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f,
apr_bucket_brigade **save_to,
apr_bucket_brigade **b, apr_pool_t *p);
/**
* Flush function for apr_brigade_* calls. This calls ap_pass_brigade
* to flush the brigade if the brigade buffer overflows.
* @param bb The brigade to flush
* @param ctx The filter to pass the brigade to
* @note this function has nothing to do with FLUSH buckets. It is simply
* a way to flush content out of a brigade and down a filter stack.
*/
AP_DECLARE_NONSTD(apr_status_t) ap_filter_flush(apr_bucket_brigade *bb,
void *ctx);
/**
* Flush the current brigade down the filter stack.
* @param f The current filter
* @param bb The brigade to flush
*/
AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb);
/**
* Write a buffer for the current filter, buffering if possible.
* @param f the filter doing the writing
* @param bb The brigade to buffer into
* @param data The data to write
* @param nbyte The number of bytes in the data
*/
#define ap_fwrite(f, bb, data, nbyte) \
apr_brigade_write(bb, ap_filter_flush, f, data, nbyte)
/**
* Write a buffer for the current filter, buffering if possible.
* @param f the filter doing the writing
* @param bb The brigade to buffer into
* @param str The string to write
*/
#define ap_fputs(f, bb, str) \
apr_brigade_puts(bb, ap_filter_flush, f, str)
/**
* Write a character for the current filter, buffering if possible.
* @param f the filter doing the writing
* @param bb The brigade to buffer into
* @param c The character to write
*/
#define ap_fputc(f, bb, c) \
apr_brigade_putc(bb, ap_filter_flush, f, c)
/**
* Write an unspecified number of strings to the current filter
* @param f the filter doing the writing
* @param bb The brigade to buffer into
* @param ... The strings to write
*/
AP_DECLARE_NONSTD(apr_status_t) ap_fputstrs(ap_filter_t *f,
apr_bucket_brigade *bb,
...);
/**
* Output data to the filter in printf format
* @param f the filter doing the writing
* @param bb The brigade to buffer into
* @param fmt The format string
* @param ... The argumets to use to fill out the format string
*/
AP_DECLARE_NONSTD(apr_status_t) ap_fprintf(ap_filter_t *f,
apr_bucket_brigade *bb,
const char *fmt,
...)
__attribute__((format(printf,3,4)));
#ifdef __cplusplus
}
#endif
#endif /* !AP_FILTER_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -