OSDN Git Service

* Fixed bug.
[modchxj/mod_chxj.git] / src / chxj_serf.c
index 67582cd..0f4489d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
+ * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -139,12 +139,14 @@ s_handle_response(serf_request_t *UNUSED(request), serf_bucket_t *response, void
     if (SERF_BUCKET_READ_ERROR(rv)) {
       ctx->rv = rv;
       apr_atomic_dec32(&ctx->requests_outstanding);
-      DBG(ctx->r, "REQ[%X] end of s_handle_response() (ERROR)", (unsigned int)(apr_size_t)ctx->r);
+      DBG(ctx->r, "REQ[%X] (ERROR)", TO_ADDR(ctx->r));
+      DBG(ctx->r,"REQ[%X] end %s()",TO_ADDR(ctx->r),__func__);
       return rv;
     }
     if (APR_STATUS_IS_EAGAIN(rv)) {
       /* 0 byte return if EAGAIN returned. */
-      DBG(ctx->r, "REQ[%X] end of s_handle_response() (EAGAIN) len:[%d]", (unsigned int)(apr_size_t)ctx->r, (int)len);
+      DBG(ctx->r,"REQ[%X] (EAGAIN) len:[%d]", TO_ADDR(ctx->r), (int)len);
+      DBG(ctx->r,"REQ[%X] end %s()",TO_ADDR(ctx->r),__func__);
       return rv;
     }
 
@@ -197,18 +199,20 @@ s_handle_response(serf_request_t *UNUSED(request), serf_bucket_t *response, void
           val++;
           key = qs_trim_string(ctx->pool, key);
           val = qs_trim_string(ctx->pool, val);
-          DBG(ctx->r, "key:[%s], val:[%s]", key, val);
+          DBG(ctx->r,"REQ[%X] key:[%s], val:[%s]", TO_ADDR(ctx->r),key, val);
           apr_table_add(ctx->headers_out, key, val);
         }
       }
       ctx->rv = APR_SUCCESS;
       apr_atomic_dec32(&ctx->requests_outstanding);
-      DBG(ctx->r, "REQ[%X] end of s_handle_response()(NORMAL)", (unsigned int)(apr_size_t)ctx->r);
+      DBG(ctx->r,"REQ[%X] (NORMAL)", TO_ADDR(ctx->r));
+      DBG(ctx->r,"REQ[%X] end %s()",TO_ADDR(ctx->r),__func__);
       return APR_EOF;
     }
 
     if (APR_STATUS_IS_EAGAIN(rv)) {
-      DBG(ctx->r, "REQ[%X] end of s_handle_response() (EAGAIN)", (unsigned int)(apr_size_t)ctx->r);
+      DBG(ctx->r,"REQ[%X] (EAGAIN)", TO_ADDR(ctx->r));
+      DBG(ctx->r,"REQ[%X] end %s()",TO_ADDR(ctx->r),__func__);
       return rv;
     }
   }
@@ -241,17 +245,19 @@ s_setup_request(serf_request_t           *request,
   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--) {
-    serf_bucket_headers_setc(hdrs_bkt, hentryp[ii].key, hentryp[ii].val);
-    DBG(ctx->r, "REQ[%X] REQUEST key:[%s], val:[%s]", (unsigned int)(apr_size_t)ctx->r, hentryp[ii].key, hentryp[ii].val);
+    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 key:[%s], val:[%s]", (unsigned int)(apr_size_t)ctx->r, "X-Chxj-Forward", "Done");
-    DBG(ctx->r, "REQ[%X] REQUEST key:[%s], val:[%s]", (unsigned int)(apr_size_t)ctx->r, "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]", (unsigned int)(apr_size_t)r, serf_bucket_headers_get(hdrs_bkt, "Content-Length"));
+  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) {
@@ -369,7 +375,15 @@ default_chxj_serf_get(request_rec *r, apr_pool_t *ppool, const char *url_path, i
   }
 
   serf_connection_close(connection);
-  ret = apr_pstrdup(ppool, handler_ctx.response);
+  if (handler_ctx.response) {
+    ret = apr_palloc(ppool, handler_ctx.response_len + 1);
+    memset(ret, 0, handler_ctx.response_len + 1);
+    memcpy(ret, handler_ctx.response, handler_ctx.response_len);
+  }
+  else {
+    ret = apr_pstrdup(ppool, "");
+  }
+  *response_len = handler_ctx.response_len;
   if (set_headers_flag) {
     r->headers_out = apr_table_copy(pool, handler_ctx.headers_out);
     *response_len = handler_ctx.response_len;
@@ -397,7 +411,7 @@ default_chxj_serf_post(request_rec *r, apr_pool_t *ppool, const char *url_path,
   handler_ctx_t handler_ctx;
   char *ret;
 
-  DBG(r, "REQ:[%X] start chxj_serf_post()", (unsigned int)(apr_size_t)r);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
 
   s_init(ppool, &pool);
@@ -475,27 +489,32 @@ default_chxj_serf_post(request_rec *r, apr_pool_t *ppool, const char *url_path,
     }
   }
 
-  DBG(r, "end of serf request");
-  DBG(r, "response_code:[%d]", handler_ctx.response_code);
-  DBG(r, "response:[%s][%" APR_SIZE_T_FMT "]", handler_ctx.response, handler_ctx.response_len);
+  DBG(r,"REQ[%X] end of serf request",TO_ADDR(r));
+  DBG(r,"REQ[%X] response_code:[%d]", TO_ADDR(r),handler_ctx.response_code);
+  DBG(r,"REQ[%X] response:[%s][%" APR_SIZE_T_FMT "]", TO_ADDR(r),handler_ctx.response, handler_ctx.response_len);
   serf_connection_close(connection);
   if (handler_ctx.response) {
-    ret = apr_pstrdup(ppool, handler_ctx.response);
+    ret = apr_palloc(ppool, handler_ctx.response_len + 1);
+    memset(ret, 0, handler_ctx.response_len + 1);
+    memcpy(ret, handler_ctx.response, handler_ctx.response_len);
   }
   else {
     ret = apr_pstrdup(ppool, "");
   }
-  if (set_headers_flag) {
+  if (set_headers_flag && !rv) {
     r->headers_out = apr_table_copy(pool, handler_ctx.headers_out);
     *response_len = handler_ctx.response_len;
     char *contentType = (char *)apr_table_get(handler_ctx.headers_out, "Content-Type");
     if (contentType) {
-      DBG(r, "response content type[%s]", contentType);
+      DBG(r,"REQ[%X] response content type[%s]", TO_ADDR(r),contentType);
       chxj_set_content_type(r, apr_pstrdup(r->pool, contentType));
     }
   }
+  if (rv) {
+    *response_len = 0;
+  }
   *response_code = handler_ctx.response_code;
-  DBG(r, "REQ:[%X] end chxj_serf_post()", (unsigned int)(apr_size_t)r);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return ret;
 }
 
@@ -515,7 +534,7 @@ default_chxj_serf_head(request_rec *r, apr_pool_t *ppool, const char *url_path,
   handler_ctx_t handler_ctx;
   char *ret;
 
-  DBG(r, "REQ:[%X] start chxj_serf_head()", (unsigned int)(apr_size_t)r);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
 
   s_init(ppool, &pool);
@@ -596,9 +615,9 @@ default_chxj_serf_head(request_rec *r, apr_pool_t *ppool, const char *url_path,
     }
   }
 
-  DBG(r, "end of serf request");
-  DBG(r, "response_code:[%d]", handler_ctx.response_code);
-  DBG(r, "response:[%s][%" APR_SIZE_T_FMT "]", handler_ctx.response, handler_ctx.response_len);
+  DBG(r,"REQ[%X] end of serf request",TO_ADDR(r));
+  DBG(r,"REQ[%X] response_code:[%d]", TO_ADDR(r),handler_ctx.response_code);
+  DBG(r,"REQ[%X] response:[%s][%" APR_SIZE_T_FMT "]", TO_ADDR(r),handler_ctx.response, handler_ctx.response_len);
   serf_connection_close(connection);
   if (handler_ctx.response) {
     ret = apr_pstrdup(ppool, handler_ctx.response);
@@ -607,7 +626,7 @@ default_chxj_serf_head(request_rec *r, apr_pool_t *ppool, const char *url_path,
     ret = apr_pstrdup(ppool, "");
   }
   *response_code = handler_ctx.response_code;
-  DBG(r, "REQ:[%X] end chxj_serf_post()", (unsigned int)(apr_size_t)r);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return handler_ctx.headers_out;
 }
 /*