2015-11-05 40 views
0

这项任务对我来说似乎很简单,但我很难过。无论我从服务器请求什么页面,我试图用此代码实现的目标是将connection:keep-alive添加到每个输出标题。然后,如果返回的页面提供了301或302(重定向状态),我将只添加该标题。这是因为我不希望客户因为到达重定向页面而必须打开新的连接。试图强制通过Apache模块保持生存

我的代码如下所示,我试着按照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}; 

回答

0

在HTTP 1.1中,持久连接是默认连接。只要确保KeepAlive on在您的服务器配置中,并且不要过度绑定它。