예제 #1
0
static int append_request_headers(void *baton,
                                  const char *key,
                                  const char *value)
{
    serf_bucket_t *hdrs_bkt = baton;
    serf_bucket_headers_setc(hdrs_bkt, key, value);
    return 0;
}
예제 #2
0
파일: chxj_serf.c 프로젝트: atkonn/mod_chxj
static apr_status_t 
s_setup_request(serf_request_t           *request,
                void                     *setup_ctx,
                serf_bucket_t            **req_bkt,
                serf_response_acceptor_t *acceptor,
                void                     **acceptor_ctx,
                serf_response_handler_t  *handler,
                void                     **handler_ctx,
                apr_pool_t               *UNUSED(pool))
{
  handler_ctx_t *ctx = setup_ctx;
  serf_bucket_t *hdrs_bkt;
  serf_bucket_t *body_bkt = NULL;
  request_rec *r = ctx->r;
  int ii;

  if (ctx->post_data) {
    body_bkt = serf_bucket_simple_create(ctx->post_data, ctx->post_data_len, NULL, NULL, serf_request_get_alloc(request));
  }

  *req_bkt = serf_bucket_request_create(ctx->method, ctx->path, body_bkt, serf_request_get_alloc(request));
  hdrs_bkt = serf_bucket_request_get_headers(*req_bkt);


  apr_array_header_t *headers = (apr_array_header_t*)apr_table_elts(r->headers_in);
  apr_table_entry_t  *hentryp = (apr_table_entry_t*)headers->elts;
  for (ii=headers->nelts-1; ii>=0; ii--) {
    DBG(ctx->r, "REQ[%X] REQUEST PREV key:[%s], val:[%s]", TO_ADDR(ctx->r), hentryp[ii].key, hentryp[ii].val);
    serf_bucket_headers_setc(hdrs_bkt, hentryp[ii].key, (hentryp[ii].val) ? hentryp[ii].val : "");
    DBG(ctx->r, "REQ[%X] REQUEST AFTER key:[%s], val:[%s]", TO_ADDR(ctx->r), hentryp[ii].key, hentryp[ii].val);
  }
  if (ctx->post_data) {
    DBG(ctx->r, "REQ[%X] REQUEST PREV key:[%s], val:[%s]", TO_ADDR(ctx->r), "X-Chxj-Forward", "Done");
    serf_bucket_headers_setc(hdrs_bkt, "X-Chxj-Forward", "Done");
    DBG(ctx->r, "REQ[%X] REQUEST AFTER key:[%s], val:[%s]", TO_ADDR(ctx->r), "X-Chxj-Forward", "Done");
    DBG(ctx->r, "REQ[%X] REQUEST PREV key:[%s], val:[%s]", TO_ADDR(ctx->r), "X-Chxj-Content-Length", apr_psprintf(r->pool, "%" APR_SIZE_T_FMT, ctx->post_data_len));
    serf_bucket_headers_setc(hdrs_bkt, "X-Chxj-Content-Length", apr_psprintf(r->pool, "%" APR_SIZE_T_FMT , ctx->post_data_len));
    DBG(ctx->r, "REQ[%X] REQUEST AFTER key:[%s], val:[%s]", TO_ADDR(ctx->r), "X-Chxj-Content-Length", apr_psprintf(r->pool, "%" APR_SIZE_T_FMT, ctx->post_data_len));
  }
  DBG(ctx->r, "REQ[%X] REQUEST Content-Length:[%s]", TO_ADDR(ctx->r), serf_bucket_headers_get(hdrs_bkt, "Content-Length"));

  apr_atomic_inc32(&(ctx->requests_outstanding));
  if (ctx->acceptor_ctx->ssl_flag) {
    serf_bucket_alloc_t *req_alloc;
    app_ctx_t *app_ctx = ctx->acceptor_ctx;

    req_alloc = serf_request_get_alloc(request);

    if (app_ctx->ssl_ctx == NULL) {
      *req_bkt = serf_bucket_ssl_encrypt_create(*req_bkt, NULL, app_ctx->bkt_alloc);
      app_ctx->ssl_ctx = serf_bucket_ssl_encrypt_context_get(*req_bkt);
    }
    else {
      *req_bkt = serf_bucket_ssl_encrypt_create(*req_bkt, app_ctx->ssl_ctx, app_ctx->bkt_alloc);
    }
  }
  *acceptor       = ctx->acceptor;
  *acceptor_ctx   = ctx->acceptor_ctx;
  *handler        = ctx->handler;
  *handler_ctx    = ctx;

  return APR_SUCCESS;
}