[英]Trying to force Keep-alive via apache module
這個任務對我來說似乎很簡單,但是我很沮喪。 我試圖用這段代碼實現的目的是connection:keep-alive
無論我從服務器請求什么頁面,都將connection:keep-alive
添加到每個輸出標頭中。 然后,僅在返回的頁面給出301或302(重定向狀態)的情況下,我才添加該標頭。 這是因為我不希望客戶端由於進入重定向頁面而不得不打開新連接。
我的代碼如下所示,我嘗試按照http://www.apachetutor.org/dev/brigades上的說明進行操作,但使事情變得更容易理解。
該代碼可以使用apxs正常編譯,但是對輸出沒有任何作用。 我可能做錯了什么? 我正在尋找不會浪費不必要內存的解決方案。
#include "httpd.h"
#include "http_core.h"
#include "http_log.h"
#include "http_protocol.h"
#include "http_config.h"
#include "apr_buckets.h"
#include "apr_general.h"
#include "apr_lib.h"
#include "util_filter.h"
#include "http_request.h"
static apr_status_t OUTF(ap_filter_t *f,apr_bucket_brigade *pbbIn){
char *lp=0;
const char *data;
request_rec* r=f->r;
conn_rec* c=r->connection;
apr_bucket *pbktIn;
apr_size_t len;
for (pbktIn=APR_BRIGADE_FIRST(pbbIn);pbktIn!=APR_BRIGADE_SENTINEL(pbbIn);pbktIn=APR_BUCKET_NEXT(pbktIn)){
if(APR_BUCKET_IS_EOS(pbktIn)){continue;}
if (apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ) != APR_SUCCESS){continue;}
if (!lp){
lp=strstr(data,"\r\n");
if (lp){
apr_bucket_split(pbktIn,(lp-data));
pbktIn=APR_BUCKET_NEXT(pbktIn);
const char* ka="connection:keep-alive\r\n";
//trying to insert "connection:keep-alive" into output data
APR_BUCKET_INSERT_BEFORE(pbktIn,apr_bucket_transient_create(ka,strlen(ka),c->bucket_alloc));
apr_bucket_split(pbktIn,strlen(ka));
APR_BUCKET_REMOVE(pbktIn);
pbktIn=APR_BUCKET_NEXT(pbktIn);
}
}
}
return ap_pass_brigade(f->next,pbbIn);
}
static void INS(request_rec *r){ap_add_output_filter("30X",NULL,r,r->connection);}
static void f301_register_hooks(apr_pool_t *p){
ap_hook_insert_filter(INS,NULL,NULL,APR_HOOK_FIRST);
ap_register_output_filter("30X",OUTF,NULL,AP_FTYPE_RESOURCE);
}
module AP_MODULE_DECLARE_DATA f301_module = {STANDARD20_MODULE_STUFF,NULL,NULL,NULL,NULL,NULL,f301_register_hooks};
在HTTP 1.1中,持久連接是默認設置。 只需確保在您的服務器配置中KeepAlive on
並且不要過分考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.