Опитвате се да принудите Keep-alive чрез apache модул

Задачата изглежда лесна за мен, но съм объркан. Това, което се опитвам да постигна с този код, е 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};

person Mike -- No longer here    schedule 05.11.2015    source източник


Отговори (1)


В HTTP 1.1 постоянните връзки са по подразбиране. Просто се уверете, че KeepAlive on е в конфигурацията на вашия сървър и не го премисляйте.

person i40west    schedule 18.12.2015