You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sh...@apache.org on 2009/09/02 16:45:11 UTC

svn commit: r810531 [1/3] - in /webservices/axis2/trunk/c/src/core/transport/http: common/ receiver/ server/apache2/ util/

Author: shankar
Date: Wed Sep  2 14:45:10 2009
New Revision: 810531

URL: http://svn.apache.org/viewvc?rev=810531&view=rev
Log:
code formatting + refactor + improving performance

Modified:
    webservices/axis2/trunk/c/src/core/transport/http/common/http_header.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_request_line.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_response_writer.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_request.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_response.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_status_line.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c
    webservices/axis2/trunk/c/src/core/transport/http/common/simple_http_svr_conn.c
    webservices/axis2/trunk/c/src/core/transport/http/receiver/http_svr_thread.c
    webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c
    webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_header.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_header.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_header.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_header.c Wed Sep  2 14:45:10 2009
@@ -34,9 +34,7 @@
     const axis2_char_t * value)
 {
     axis2_http_header_t *http_header = NULL;
-
     http_header = (axis2_http_header_t *)AXIS2_MALLOC(env->allocator, sizeof(axis2_http_header_t));
-
     if(!http_header)
     {
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
@@ -49,6 +47,12 @@
     return http_header;
 }
 
+/**
+ * Creates http header object from a string having format "header_name:     header_value"
+ * (e.g. "SOAPAction: urn:hello")
+ * @param env pointer to environment struct
+ * @param str pointer to str
+ */
 AXIS2_EXTERN axis2_http_header_t *AXIS2_CALL
 axis2_http_header_create_by_str(
     const axutil_env_t * env,
@@ -58,37 +62,52 @@
     axis2_char_t *ch = NULL;
     axis2_char_t *ch2 = NULL;
     axis2_http_header_t *ret = NULL;
-
+    int tmp_str_len = 0;
     AXIS2_PARAM_CHECK(env->error, str, NULL);
 
+    /*
     tmp_str = axutil_strdup(env, str);
     if(!tmp_str)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "unable to strdup string, %s", str);
         return NULL;
     }
+    */
+    /*
+     * strdup is removed to increase the performance. This method is called from
+     * axis2_simple_http_svr_conn_read_request and axis2_http_client_recieve_header and both of them
+     * passes a temporary string. hence we can modify the contents without doing a strdup.
+     * Above code is commented after 1.6.0 . If no issue is found until 1.8.0, above can be removed
+     */
+    tmp_str = (axis2_char_t *)str;
+
     /* remove trailing \r\n */
-    if((axutil_strlen(tmp_str) >= 2) && (AXIS2_RETURN == tmp_str[axutil_strlen(tmp_str) - 2]))
+    tmp_str_len = axutil_strlen(tmp_str);
+    if((tmp_str_len >= 2) && (AXIS2_RETURN == tmp_str[tmp_str_len - 2]))
     {
-        tmp_str[axutil_strlen(tmp_str) - 2] = AXIS2_ESC_NULL;
+        tmp_str[tmp_str_len - 2] = AXIS2_ESC_NULL;
     }
 
+    /* get http header */
     ch = strchr((const char *)tmp_str, AXIS2_COLON);
     if(!ch)
     {
-        AXIS2_FREE(env->allocator, tmp_str);
+        /*AXIS2_FREE(env->allocator, tmp_str);*/
         return NULL;
     }
+    *ch = AXIS2_ESC_NULL;
+
+    /* get http header value */
+    ch2 = ++ch;
 
-    ch2 = ch + sizeof(axis2_char_t);
     /* skip spaces */
     while(AXIS2_SPACE == *ch2)
     {
-        ch2 += sizeof(axis2_char_t);
+        ++ch2;
     }
-    *ch = AXIS2_ESC_NULL;
+
     ret = axis2_http_header_create(env, tmp_str, ch2);
-    AXIS2_FREE(env->allocator, tmp_str);
+    /*AXIS2_FREE(env->allocator, tmp_str);*/
     return ret;
 }
 

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_request_line.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_request_line.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_request_line.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_request_line.c Wed Sep  2 14:45:10 2009
@@ -85,12 +85,19 @@
     return;
 }
 
+/**
+ * Parses a line "<http method> <uri location> <http version>CRLF" and creates http_request_line
+ * object. E.g "POST /axis2/services/echo HTTP/1.1\r\n"
+ * @param env pointer to environment struct
+ * @param str pointer to the line to be parsed
+ * @return created object if success. NULL otherwise
+ */
 AXIS2_EXTERN axis2_http_request_line_t *AXIS2_CALL
 axis2_http_request_line_parse_line(
     const axutil_env_t * env,
     const axis2_char_t * str)
 {
-    axis2_char_t *req_line = NULL;
+    /*axis2_char_t *req_line = NULL;*/
     axis2_char_t *method = NULL;
     axis2_char_t *uri = NULL;
     axis2_char_t *http_version = NULL;
@@ -98,18 +105,22 @@
     axis2_char_t *tmp = NULL;
     int i = 0;
 
-    AXIS2_PARAM_CHECK(env->error, str, NULL);
+    if(!str)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid parameter is given to parse");
+        return NULL;
+    }
 
     tmp = axutil_strstr(str, AXIS2_HTTP_CRLF);
-
     if(!tmp)
     {
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
 
-    i = (int)(tmp - str);
-    /* We are sure that the difference lies within the int range */
+    i = (int)(tmp - str); /* We are sure that the difference lies within the int range */
+
+    /*
     req_line = AXIS2_MALLOC(env->allocator, i * sizeof(axis2_char_t) + 1);
     if(!req_line)
     {
@@ -119,28 +130,42 @@
     memcpy(req_line, str, i * sizeof(axis2_char_t));
     req_line[i] = AXIS2_ESC_NULL;
     tmp = req_line;
+    */
+    /* we don't need to do a malloc and memcpy, because this method is only used by
+     * axis2_simple_http_svr_conn_read_request and it passes a temporary string. So, we can just
+     * set it as req_line and set the escape characters. this is done after 1.6.0 and if no issues
+     * found until 1.8.0, above code comment can be removed after 1.8.0
+     */
+
+    tmp = (axis2_char_t *)str;
+    tmp[i] = AXIS2_ESC_NULL;
 
+    /* find http method */
     method = tmp;
     tmp = strchr(tmp, AXIS2_SPACE);
     if(!tmp)
     {
-        AXIS2_FREE(env->allocator, req_line);
+        /*AXIS2_FREE(env->allocator, req_line);*/
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
     *tmp++ = AXIS2_ESC_NULL;
+
+    /* find URI */
     uri = tmp;
     tmp = strrchr(tmp, AXIS2_SPACE);
     if(!tmp)
     {
-        AXIS2_FREE(env->allocator, req_line);
+        /*AXIS2_FREE(env->allocator, req_line);*/
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
     *tmp++ = AXIS2_ESC_NULL;
+
+    /* find HTTP version */
     http_version = tmp;
     ret = axis2_http_request_line_create(env, method, uri, http_version);
-    AXIS2_FREE(env->allocator, req_line);
+    /*AXIS2_FREE(env->allocator, req_line);*/
 
     return ret;
 }

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_response_writer.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_response_writer.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_response_writer.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_response_writer.c Wed Sep  2 14:45:10 2009
@@ -33,7 +33,6 @@
 {
     return axis2_http_response_writer_create_with_encoding(env, stream,
         AXIS2_HTTP_DEFAULT_CONTENT_CHARSET);
-
 }
 
 AXIS2_EXTERN axis2_http_response_writer_t *AXIS2_CALL
@@ -43,21 +42,16 @@
     const axis2_char_t * encoding)
 {
     axis2_http_response_writer_t *response_writer = NULL;
-
-    AXIS2_PARAM_CHECK(env->error, encoding, NULL);
-
     response_writer = (axis2_http_response_writer_t *)AXIS2_MALLOC(env->allocator,
         sizeof(axis2_http_response_writer_t));
-
     if(!response_writer)
     {
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
         return NULL;
     }
-    memset((void *)response_writer, 0, sizeof(axis2_http_response_writer_t));
+
     response_writer->stream = stream;
     response_writer->encoding = (axis2_char_t *)axutil_strdup(env, encoding);
-
     return response_writer;
 }
 
@@ -66,15 +60,8 @@
     axis2_http_response_writer_t * response_writer,
     const axutil_env_t * env)
 {
-    if(!response_writer)
-    {
-        return;
-    }
-
     AXIS2_FREE(env->allocator, response_writer->encoding);
     AXIS2_FREE(env->allocator, response_writer);
-
-    return;
 }
 
 AXIS2_EXTERN axis2_char_t *AXIS2_CALL
@@ -92,12 +79,11 @@
     char c)
 {
     int write = -1;
-    AXIS2_PARAM_CHECK(env->error, response_writer, AXIS2_FAILURE);
-
     if(!response_writer->stream)
     {
         return AXIS2_FAILURE;
     }
+
     write = axutil_stream_write(response_writer->stream, env, &c, 1);
     if(write < 0)
     {
@@ -140,9 +126,6 @@
     int write = -1;
     int len = -1;
 
-    AXIS2_PARAM_CHECK(env->error, response_writer, AXIS2_FAILURE);
-    AXIS2_PARAM_CHECK(env->error, str, AXIS2_FAILURE);
-
     len = axutil_strlen(str);
     if(!response_writer->stream)
     {
@@ -153,8 +136,7 @@
     if(write < 0)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-            "failed to write to stream\
-string %s of length %d", str, len);
+            "failed to write to stream string %s of length %d", str, len);
         return AXIS2_FAILURE;
     }
 
@@ -178,8 +160,6 @@
     const axutil_env_t * env,
     const char *str)
 {
-    AXIS2_PARAM_CHECK(env->error, str, AXIS2_FAILURE);
-
     if(AXIS2_SUCCESS == axis2_http_response_writer_print_str(response_writer, env, str))
     {
         return axis2_http_response_writer_print_str(response_writer, env, AXIS2_HTTP_CRLF);

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_request.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_request.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_request.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_request.c Wed Sep  2 14:45:10 2009
@@ -39,27 +39,24 @@
     axutil_stream_t * content)
 {
     axis2_http_simple_request_t *simple_request = NULL;
-
     simple_request = (axis2_http_simple_request_t *)AXIS2_MALLOC(env->allocator,
         sizeof(axis2_http_simple_request_t));
-
     if(!simple_request)
     {
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
         return NULL;
     }
+
     memset((void *)simple_request, 0, sizeof(axis2_http_simple_request_t));
     simple_request->request_line = request_line;
     simple_request->stream = content;
-    simple_request->header_group = NULL;
-    simple_request->owns_stream = AXIS2_FALSE;
 
     if(!(simple_request->stream))
     {
         simple_request->stream = axutil_stream_create_basic(env);
         if(!simple_request->stream)
         {
-            axis2_http_simple_request_free((axis2_http_simple_request_t *)simple_request, env);
+            axis2_http_simple_request_free(simple_request, env);
             AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
             return NULL;
         }
@@ -86,18 +83,13 @@
     axis2_http_simple_request_t * simple_request,
     const axutil_env_t * env)
 {
-    if(!simple_request)
-    {
-        return;
-    }
-
-    if(AXIS2_TRUE == simple_request->owns_stream)
+    /* free the stream only if we own it. Otherwise shouldn't free the stream
+     * since it belongs to the socket
+     */
+    if(simple_request->owns_stream)
     {
         axutil_stream_free(simple_request->stream, env);
     }
-    /*
-     Don't free the stream since it belongs to the socket
-     */
 
     if(simple_request->request_line)
     {
@@ -110,16 +102,12 @@
         axis2_http_header_t *tmp = NULL;
         for(i = 0; i < axutil_array_list_size(simple_request->header_group, env); i++)
         {
-            tmp = (axis2_http_header_t *)axutil_array_list_get(simple_request-> header_group, env,
-                i);
+            tmp = (axis2_http_header_t*)axutil_array_list_get(simple_request->header_group, env, i);
             axis2_http_header_free(tmp, env);
-
         }
         axutil_array_list_free(simple_request->header_group, env);
     }
     AXIS2_FREE(env->allocator, simple_request);
-
-    return;
 }
 
 AXIS2_EXTERN axis2_http_request_line_t *AXIS2_CALL
@@ -200,8 +188,6 @@
     axutil_array_list_t *header_group = NULL;
     int i = 0;
     int count = 0;
-    axis2_http_header_t *tmp_header = NULL;
-    axis2_char_t *tmp_name = NULL;
 
     AXIS2_PARAM_CHECK(env->error, str, NULL);
 
@@ -209,23 +195,22 @@
     if(!simple_request->header_group)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-            "http simple request \
-does not contain headers, unable to find: %s header", str);
+            "http simple request does not contain any headers; unable to find: %s header", str);
         return NULL;
     }
+
     if(0 == axutil_array_list_size(header_group, env))
     {
         AXIS2_LOG_WARNING(env->log, AXIS2_LOG_SI,
-            "http simple request \
- contain zero headers, unable to find: %s header", str);
+            "http simple request contain zero headers, unable to find: %s header", str);
         return NULL;
     }
 
     count = axutil_array_list_size(header_group, env);
-
     for(i = 0; i < count; i++)
     {
-
+        axis2_http_header_t *tmp_header = NULL;
+        axis2_char_t *tmp_name = NULL;
         tmp_header = (axis2_http_header_t *)axutil_array_list_get(header_group, env, i);
         tmp_name = axis2_http_header_get_name(tmp_header, env);
         if(0 == axutil_strcasecmp(str, tmp_name))

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_response.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_response.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_response.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_simple_response.c Wed Sep  2 14:45:10 2009
@@ -42,36 +42,26 @@
     axutil_stream_t * content)
 {
     axis2_http_simple_response_t *ret = NULL;
-    axis2_http_simple_response_t *simple_response = NULL;
-
     ret = axis2_http_simple_response_create_default(env);
     if(!ret)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "axis2 http simple response creation failed");
         return NULL;
     }
-    simple_response = ret;
 
-    if(!simple_response)
-    {
-        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-        return NULL;
-    }
-
-    simple_response->status_line = status_line;
+    ret->status_line = status_line;
     if(http_hdr_count > 0 && http_headers)
     {
         int i = 0;
-        simple_response->header_group = axutil_array_list_create(env, http_hdr_count);
+        ret->header_group = axutil_array_list_create(env, http_hdr_count);
 
         for(i = 0; i < (int)http_hdr_count; i++)
         /* We are sure that the difference lies within the int range */
         {
-            axutil_array_list_add(simple_response->header_group, env, (void *)http_headers[i]);
+            axutil_array_list_add(ret->header_group, env, (void *)http_headers[i]);
         }
     }
-    simple_response->stream = content;
-
+    ret->stream = content;
     return ret;
 }
 
@@ -80,22 +70,15 @@
     const axutil_env_t * env)
 {
     axis2_http_simple_response_t *simple_response = NULL;
-
     simple_response = (axis2_http_simple_response_t *)AXIS2_MALLOC(env->allocator,
         sizeof(axis2_http_simple_response_t));
-
     if(!simple_response)
     {
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
         return NULL;
     }
-    memset((void *)simple_response, 0, sizeof(axis2_http_simple_response_t));
-    simple_response->status_line = NULL;
-    simple_response->header_group = NULL;
-    simple_response->stream = NULL;
-    simple_response->mime_parts = NULL;
-    simple_response->mtom_sending_callback_name = NULL;
 
+    memset((void *)simple_response, 0, sizeof(axis2_http_simple_response_t));
     return simple_response;
 }
 
@@ -104,7 +87,6 @@
     axis2_http_simple_response_t * simple_response,
     const axutil_env_t * env)
 {
-
     if(simple_response->status_line)
     {
         axis2_http_status_line_free(simple_response->status_line, env);
@@ -113,14 +95,13 @@
     if(simple_response->header_group)
     {
         int i = 0;
-        axis2_http_header_t *tmp = NULL;
         for(i = 0; i < axutil_array_list_size(simple_response->header_group, env); i++)
         {
-            tmp = (axis2_http_header_t *)axutil_array_list_get(simple_response-> header_group, env,
-                i);
+            void *tmp = NULL;
+            tmp = axutil_array_list_get(simple_response-> header_group, env, i);
             if(tmp)
             {
-                axis2_http_header_free(tmp, env);
+                axis2_http_header_free((axis2_http_header_t *)tmp, env);
             }
         }
         axutil_array_list_free(simple_response->header_group, env);
@@ -131,23 +112,19 @@
         int i = 0;
         for(i = 0; i < axutil_array_list_size(simple_response->mime_parts, env); i++)
         {
-            axiom_mime_part_t *mime_part = NULL;
-            mime_part = (axiom_mime_part_t *)axutil_array_list_get(simple_response->mime_parts,
-                env, i);
+            void *mime_part = NULL;
+            mime_part = axutil_array_list_get(simple_response->mime_parts, env, i);
             if(mime_part)
             {
-                axiom_mime_part_free(mime_part, env);
+                axiom_mime_part_free((axiom_mime_part_t *)mime_part, env);
             }
         }
         axutil_array_list_free(simple_response->mime_parts, env);
     }
 
+     /* Stream is not freed. Assumption : stream doesn't belong to the response */
+
     AXIS2_FREE(env->allocator, simple_response);
-    /* 
-     * Stream is not freed
-     * Assumption : stream doesn't belong to the response
-     */
-    return;
 }
 
 axis2_status_t AXIS2_CALL
@@ -158,35 +135,23 @@
     const int status_code,
     const axis2_char_t * phrase)
 {
-    axis2_char_t *tmp_status_line_str = NULL;
-
-    AXIS2_PARAM_CHECK(env->error, http_ver, AXIS2_FAILURE);
-    AXIS2_PARAM_CHECK(env->error, status_code, AXIS2_FAILURE);
-    AXIS2_PARAM_CHECK(env->error, phrase, AXIS2_FAILURE);
-
-    tmp_status_line_str = AXIS2_MALLOC(env->allocator, (axutil_strlen(http_ver) + axutil_strlen(
-        phrase) + 8) * sizeof(axis2_char_t *));
-
-    if(!tmp_status_line_str)
+    if(!http_ver || !phrase || !status_code)
     {
-        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "invalid parameter given");
+        return AXIS2_FAILURE;
     }
 
-    sprintf(tmp_status_line_str, "%s %3d %s%s", http_ver, status_code, phrase, AXIS2_HTTP_CRLF);
-
     if(simple_response->status_line)
     {
         axis2_http_status_line_free(simple_response->status_line, env);
-        simple_response->status_line = NULL;
     }
-    simple_response->status_line = axis2_http_status_line_create(env, tmp_status_line_str);
-    AXIS2_FREE(env->allocator, tmp_status_line_str);
 
+    simple_response->status_line = axis2_http_status_line_create_with_values(
+        env, http_ver, status_code, phrase);
     if(!simple_response->status_line)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-            "axis2 http status line creation failed for tmp \
-string %s", tmp_status_line_str);
+            "http status line creation failed for string %s %3d %s", http_ver, status_code, phrase);
         return AXIS2_FAILURE;
     }
     return AXIS2_SUCCESS;
@@ -341,8 +306,6 @@
     const axis2_char_t * str)
 {
     axutil_array_list_t *header_group = NULL;
-    axis2_http_header_t *tmp_header = NULL;
-    axis2_char_t *tmp_name = NULL;
     int i = 0;
     int count = 0;
 
@@ -352,16 +315,17 @@
     if(!header_group)
     {
         /* Even though we couldn't complete the op, we are sure that the
-         * requred header is no more in the request. So we can proceed without a
+         * required header is no more in the request. So we can proceed without a
          * problem.
          */
         return AXIS2_SUCCESS;
     }
 
     count = axutil_array_list_size(header_group, env);
-
     for(i = 0; i < count; i++)
     {
+        axis2_http_header_t *tmp_header = NULL;
+        axis2_char_t *tmp_name = NULL;
         tmp_header = (axis2_http_header_t *)axutil_array_list_get(header_group, env, i);
         tmp_name = axis2_http_header_get_name(tmp_header, env);
         if(0 == axutil_strcasecmp(str, tmp_name))
@@ -382,8 +346,6 @@
 {
     int i = 0;
     int count = 0;
-    axis2_http_header_t *tmp_header = NULL;
-    axis2_char_t *tmp_name = NULL;
     axutil_array_list_t *header_group = NULL;
 
     AXIS2_PARAM_CHECK(env->error, header, AXIS2_FAILURE);
@@ -395,24 +357,25 @@
         return AXIS2_SUCCESS;
     }
 
-    /* If a header with the same name exists
-     * search and remove the old header
-     */
+    /* If a header with the same name exists search and remove the old header */
     header_group = simple_response->header_group;
-
     count = axutil_array_list_size(header_group, env);
     for(i = 0; i < count; i++)
     {
+        axis2_http_header_t *tmp_header = NULL;
+        axis2_char_t *tmp_name = NULL;
         tmp_header = (axis2_http_header_t *)axutil_array_list_get(header_group, env, i);
         tmp_name = axis2_http_header_get_name(tmp_header, env);
         if(0 == axutil_strcasecmp(axis2_http_header_get_name(header, env), tmp_name))
         {
             axis2_http_header_free(tmp_header, env);
-            axutil_array_list_remove(header_group, env, i);
-            break;
+            axutil_array_list_set(header_group, env, i, header);
+            return AXIS2_SUCCESS;
         }
     }
-    axutil_array_list_add(simple_response->header_group, env, (void *)header);
+
+    /* if header is not found, then we have to add it */
+    axutil_array_list_add(header_group, env, header);
     return AXIS2_SUCCESS;
 }
 
@@ -589,9 +552,9 @@
     if(!simple_response->header_group)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "axis2 simple response , headers not available");
-
         return AXIS2_FALSE;
     }
+
     count = axutil_array_list_size(simple_response->header_group, env);
     if(0 == count)
     {
@@ -601,10 +564,13 @@
 
     for(i = 0; i < count; i++)
     {
-        header_name = axis2_http_header_get_name((axis2_http_header_t *)axutil_array_list_get(
-            simple_response->header_group, env, i), env);
+        axis2_http_header_t *header = (axis2_http_header_t *)axutil_array_list_get(
+            simple_response->header_group, env, i);
+        header_name = axis2_http_header_get_name(header, env);
         if(0 == axutil_strcasecmp(name, header_name))
+        {
             return AXIS2_TRUE;
+        }
     }
     return AXIS2_FALSE;
 }

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_status_line.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_status_line.c?rev=810531&r1=810530&r2=810531&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_status_line.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_status_line.c Wed Sep  2 14:45:10 2009
@@ -19,6 +19,7 @@
 #include <axutil_string.h>
 #include <axis2_http_transport.h>
 #include <string.h>
+#include <stdio.h>
 #include <axutil_types.h>
 
 struct axis2_http_status_line
@@ -52,23 +53,22 @@
     }
     memset((void *)status_line, 0, sizeof(axis2_http_status_line_t));
     status_line->line = (axis2_char_t *)axutil_strdup(env, str);
-    status_line->http_version = NULL;
-    status_line->reason_phrase = NULL;
-    status_line->status_code = NULL;
 
+    /* extract status code, phrase and version from given string */
     tmp = strstr(str, AXIS2_HTTP_CRLF);
     if(!tmp)
     {
-        axis2_http_status_line_free((axis2_http_status_line_t *)status_line, env);
+        axis2_http_status_line_free(status_line, env);
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
-    i = (int)(tmp - str);
-    /* We are sure that the difference lies within the int range */
+
+    i = (int)(tmp - str); /* We are sure that the difference lies within the int range */
+
     tmp_status_line = AXIS2_MALLOC(env->allocator, i * sizeof(axis2_char_t) + 1);
     if(!tmp_status_line)
     {
-        axis2_http_status_line_free((axis2_http_status_line_t *)status_line, env);
+        axis2_http_status_line_free(status_line, env);
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
         return NULL;
     }
@@ -76,40 +76,92 @@
     tmp_status_line[i] = AXIS2_ESC_NULL;
     tmp = tmp_status_line;
 
+    /* get HTTP version */
     http_version = tmp;
     tmp = strchr(tmp, AXIS2_SPACE);
     if(!tmp)
     {
         AXIS2_FREE(env->allocator, tmp_status_line);
-        axis2_http_status_line_free((axis2_http_status_line_t *)status_line, env);
+        axis2_http_status_line_free(status_line, env);
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
-
     *tmp++ = AXIS2_ESC_NULL;
+
+    /* get status code */
     status_code = tmp;
     tmp = strchr(tmp, AXIS2_SPACE);
     if(!tmp)
     {
         AXIS2_FREE(env->allocator, tmp_status_line);
-        axis2_http_status_line_free((axis2_http_status_line_t *)status_line, env);
+        axis2_http_status_line_free(status_line, env);
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, AXIS2_FAILURE);
         return NULL;
     }
     *tmp++ = AXIS2_ESC_NULL;
+
+    /* get reason phrase */
     reason_phrase = tmp;
+
+    /* populate values */
     status_line->http_version = (axis2_char_t *)axutil_strdup(env, http_version);
     status_line->status_code = (axis2_char_t *)axutil_strdup(env, status_code);
     status_line->reason_phrase = (axis2_char_t *)axutil_strdup(env, reason_phrase);
+    AXIS2_FREE(env->allocator, tmp_status_line);
+
+    if(!status_line->http_version || !status_line->reason_phrase || !status_line->status_code)
+    {
+        axis2_http_status_line_free(status_line, env);
+        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        return NULL;
+    }
+
+    return status_line;
+}
+
+AXIS2_EXTERN axis2_http_status_line_t *AXIS2_CALL
+axis2_http_status_line_create_with_values(
+    const axutil_env_t * env,
+    const axis2_char_t * http_ver,
+    const int status_code,
+    const axis2_char_t * phrase)
+{
+    axis2_http_status_line_t *status_line = NULL;
+    status_line = (axis2_http_status_line_t *)AXIS2_MALLOC(env->allocator,
+        sizeof(axis2_http_status_line_t));
+    if(!status_line)
+    {
+        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        return NULL;
+    }
+    memset((void *)status_line, 0, sizeof(axis2_http_status_line_t));
+
+    status_line->status_code = AXIS2_MALLOC(env->allocator, 6 * sizeof(axis2_char_t *));
+    if(!status_line->status_code)
+    {
+        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        axis2_http_status_line_free(status_line, env);
+        return NULL;
+    }
+    sprintf(status_line->status_code, "%3d", status_code);
 
+    status_line->http_version = axutil_strdup(env, http_ver);
+    status_line->reason_phrase = axutil_strdup(env, phrase);
     if(!status_line->http_version || !status_line->reason_phrase)
     {
-        AXIS2_FREE(env->allocator, tmp_status_line);
-        axis2_http_status_line_free((axis2_http_status_line_t *)status_line, env);
+        axis2_http_status_line_free(status_line, env);
+        AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        return NULL;
+    }
+
+    status_line->line = axutil_strcat(env, http_ver, " ", status_line->status_code, " ", phrase,
+        AXIS2_HTTP_CRLF, NULL);
+    if(!status_line->line)
+    {
+        axis2_http_status_line_free(status_line, env);
         AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
         return NULL;
     }
-    AXIS2_FREE(env->allocator, tmp_status_line);
 
     return status_line;
 }