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 se...@apache.org on 2008/03/17 19:03:27 UTC

svn commit: r637997 - in /webservices/axis2/trunk/c: include/axis2_msg_ctx.h src/core/context/msg_ctx.c src/core/transport/http/common/http_worker.c src/core/transport/http/server/apache2/apache2_worker.c src/core/util/core_utils.c

Author: senaka
Date: Mon Mar 17 11:03:12 2008
New Revision: 637997

URL: http://svn.apache.org/viewvc?rev=637997&view=rev
Log:
Adding ability to pass Accept and Accept-Charset Header values to service through msg_ctx

Modified:
    webservices/axis2/trunk/c/include/axis2_msg_ctx.h
    webservices/axis2/trunk/c/src/core/context/msg_ctx.c
    webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c
    webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c
    webservices/axis2/trunk/c/src/core/util/core_utils.c

Modified: webservices/axis2/trunk/c/include/axis2_msg_ctx.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_msg_ctx.h?rev=637997&r1=637996&r2=637997&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_msg_ctx.h (original)
+++ webservices/axis2/trunk/c/include/axis2_msg_ctx.h Mon Mar 17 11:03:12 2008
@@ -1735,6 +1735,80 @@
         axutil_hash_t * transport_headers);
 
     /**
+     * Retrieves HTTP Accept-Charset records.
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @return HTTP Accept-Charset records associated.
+     */
+    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+    axis2_msg_ctx_get_http_accept_charset_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env);
+
+    /**
+     * Retrieves HTTP Accept-Charset records, and removes them
+     * from the message context
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @return HTTP Accept-Charset records associated.
+     */
+    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+    axis2_msg_ctx_extract_http_accept_charset_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env);
+
+    /**
+     * Sets the HTTP Accept-Charset records
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @param accept_charset_record_list an Array List containing the
+     * HTTP Accept-Charset records
+     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
+     */
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+    axis2_msg_ctx_set_http_accept_charset_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env,
+        axutil_array_list_t * accept_charset_record_list);
+
+    /**
+     * Retrieves HTTP Accept records.
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @return HTTP Accept records associated.
+     */
+    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+    axis2_msg_ctx_get_http_accept_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env);
+
+    /**
+     * Retrieves HTTP Accept records, and removes them
+     * from the message context
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @return HTTP Accept records associated.
+     */
+    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+    axis2_msg_ctx_extract_http_accept_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env);
+
+    /**
+     * Sets the HTTP Accept records
+     * @param msg_ctx message context
+     * @param env pointer to environment struct
+     * @param accept_record_list an Array List containing the
+     * HTTP Accept records
+     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
+     */
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+    axis2_msg_ctx_set_http_accept_record_list(
+        axis2_msg_ctx_t * msg_ctx,
+        const axutil_env_t * env,
+        axutil_array_list_t * accept_record_list);
+
+    /**
      * Gets the transfer encoding used
      * @param msg_ctx message context
      * @param env pointer to environment struct

Modified: webservices/axis2/trunk/c/src/core/context/msg_ctx.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/context/msg_ctx.c?rev=637997&r1=637996&r2=637997&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/context/msg_ctx.c (original)
+++ webservices/axis2/trunk/c/src/core/context/msg_ctx.c Mon Mar 17 11:03:12 2008
@@ -25,6 +25,7 @@
 #include <axis2_transport_in_desc.h>
 #include <axis2_transport_out_desc.h>
 #include <axis2_http_out_transport_info.h>
+#include <axis2_http_accept_record.h>
 #include <axiom_soap_envelope.h>
 #include <axiom_soap_const.h>
 #include <axis2_options.h>
@@ -200,6 +201,8 @@
     axutil_stream_t *transport_out_stream;
     axis2_http_out_transport_info_t *http_out_transport_info;
     axutil_hash_t *transport_headers;
+    axutil_array_list_t *accept_record_list;
+    axutil_array_list_t *accept_charset_record_list;
     axis2_char_t *transfer_encoding;
     axis2_char_t *transport_url;
     axis2_bool_t is_auth_failure;
@@ -274,6 +277,8 @@
     msg_ctx->transport_out_stream = NULL;
     msg_ctx->http_out_transport_info = NULL;
     msg_ctx->transport_headers = NULL;
+    msg_ctx->accept_record_list = NULL;
+    msg_ctx->accept_charset_record_list = NULL;
     msg_ctx->transfer_encoding = NULL;
     msg_ctx->transport_url = NULL;
     msg_ctx->response_soap_envelope = NULL;
@@ -421,6 +426,36 @@
         axutil_hash_free(msg_ctx->transport_headers, env);
     }
 
+    if (msg_ctx->accept_charset_record_list)
+    {
+        axis2_http_accept_record_t *rec = NULL;
+        while (axutil_array_list_size(msg_ctx->accept_charset_record_list, env))
+        {
+            rec = (axis2_http_accept_record_t *)
+                axutil_array_list_remove(msg_ctx->accept_charset_record_list, env, 0);
+            if (rec)
+            {
+                axis2_http_accept_record_free(rec, env);
+            }
+        }
+        axutil_array_list_free(msg_ctx->accept_charset_record_list, env);
+    }
+
+    if (msg_ctx->accept_record_list)
+    {
+        axis2_http_accept_record_t *rec = NULL;
+        while (axutil_array_list_size(msg_ctx->accept_record_list, env))
+        {
+            rec = (axis2_http_accept_record_t *)
+                axutil_array_list_remove(msg_ctx->accept_record_list, env, 0);
+            if (rec)
+            {
+                axis2_http_accept_record_free(rec, env);
+            }
+        }
+        axutil_array_list_free(msg_ctx->accept_record_list, env);
+    }
+
     if (msg_ctx->transfer_encoding)
     {
         AXIS2_FREE(env->allocator, msg_ctx->transfer_encoding);
@@ -2180,6 +2215,138 @@
         }
 
         msg_ctx->transport_headers = transport_headers;
+    }
+    else
+    {
+        return AXIS2_FAILURE;
+    }
+
+    return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+axis2_msg_ctx_get_http_accept_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env)
+{
+    if (msg_ctx)
+    {
+        return msg_ctx->accept_record_list;
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+axis2_msg_ctx_extract_http_accept_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env)
+{
+    axutil_array_list_t *temp = NULL;
+    if (msg_ctx)
+    {
+        temp = msg_ctx->accept_record_list;
+        msg_ctx->accept_record_list = NULL;
+        return temp;
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_msg_ctx_set_http_accept_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env,
+    axutil_array_list_t * accept_record_list)
+{
+    if (msg_ctx)
+    {
+        if (msg_ctx->accept_record_list && 
+            msg_ctx->accept_record_list != accept_record_list)
+        {
+            axis2_http_accept_record_t *rec = NULL;
+            while (axutil_array_list_size(msg_ctx->accept_record_list, env))
+            {
+                rec = (axis2_http_accept_record_t *)
+                    axutil_array_list_remove(msg_ctx->accept_record_list, env, 0);
+                if (rec)
+                {
+                    axis2_http_accept_record_free(rec, env);
+                }
+            }
+            axutil_array_list_free(msg_ctx->accept_record_list, env);
+        }
+        msg_ctx->accept_record_list = accept_record_list;
+    }
+    else
+    {
+        return AXIS2_FAILURE;
+    }
+
+    return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+axis2_msg_ctx_get_http_accept_charset_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env)
+{
+    if (msg_ctx)
+    {
+        return msg_ctx->accept_charset_record_list;
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
+axis2_msg_ctx_extract_http_accept_charset_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env)
+{
+    axutil_array_list_t *temp = NULL;
+    if (msg_ctx)
+    {
+        temp = msg_ctx->accept_charset_record_list;
+        msg_ctx->accept_charset_record_list = NULL;
+        return temp;
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_msg_ctx_set_http_accept_charset_record_list(
+    axis2_msg_ctx_t * msg_ctx,
+    const axutil_env_t * env,
+    axutil_array_list_t * accept_charset_record_list)
+{
+    if (msg_ctx)
+    {
+        if (msg_ctx->accept_charset_record_list && 
+            msg_ctx->accept_charset_record_list != accept_charset_record_list)
+        {
+            axis2_http_accept_record_t *rec = NULL;
+            while (axutil_array_list_size(msg_ctx->accept_charset_record_list, env))
+            {
+                rec = (axis2_http_accept_record_t *)
+                    axutil_array_list_remove(msg_ctx->accept_charset_record_list, env, 0);
+                if (rec)
+                {
+                    axis2_http_accept_record_free(rec, env);
+                }
+            }
+            axutil_array_list_free(msg_ctx->accept_charset_record_list, env);
+        }
+        msg_ctx->accept_charset_record_list = accept_charset_record_list;
     }
     else
     {

Modified: webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c?rev=637997&r1=637996&r2=637997&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/common/http_worker.c Mon Mar 17 11:03:12 2008
@@ -25,6 +25,7 @@
 #include <axis2_http_request_line.h>
 #include <axis2_http_out_transport_info.h>
 #include <axis2_http_transport_utils.h>
+#include <axis2_http_accept_record.h>
 #include <axis2_op_ctx.h>
 #include <axis2_engine.h>
 #include <axutil_uuid_gen.h>
@@ -32,6 +33,7 @@
 #include <axutil_property.h>
 #include <axiom_soap.h>
 #include <string.h>
+#include <axutil_string_util.h>
 
 struct axis2_http_worker
 {
@@ -263,6 +265,42 @@
         accept_header_value = axis2_http_header_get_value(accept_header,
                                                           env);
     }
+    if (accept_header_value)
+    {
+        axutil_array_list_t *accept_header_field_list = NULL;
+        axutil_array_list_t *accept_record_list = NULL;
+        accept_header_field_list = axutil_tokenize(env, accept_header_value, ',');
+        if (accept_header_field_list && 
+            axutil_array_list_size(accept_header_field_list, env) > 0)
+        {
+            axis2_char_t *token = NULL;
+            accept_record_list =
+                axutil_array_list_create(env,
+                    axutil_array_list_size(accept_header_field_list, env));
+            do
+            {
+                if (token)
+                {
+                    axis2_http_accept_record_t *rec = NULL;
+                    rec = axis2_http_accept_record_create(env, token);
+                    if (rec)
+                    {
+                        axutil_array_list_add(accept_record_list, env, rec);
+                    }
+                    AXIS2_FREE(env->allocator, token);
+                }
+                token = (axis2_char_t *)
+                    axutil_array_list_remove(accept_header_field_list, env, 0);
+            }
+            while(token);
+        }
+        if (accept_record_list && 
+            axutil_array_list_size(accept_record_list, env) > 0)
+        {
+            axis2_msg_ctx_set_http_accept_record_list(msg_ctx, env,
+                accept_record_list);
+        }
+    }
 
     accept_charset_header = axis2_http_simple_request_get_first_header(
         simple_request,
@@ -272,6 +310,43 @@
     {
         accept_charset_header_value = axis2_http_header_get_value(accept_charset_header,
                                                                   env);
+    }
+    if (accept_charset_header_value)
+    {
+        axutil_array_list_t *accept_charset_header_field_list = NULL;
+        axutil_array_list_t *accept_charset_record_list = NULL;
+        accept_charset_header_field_list =
+            axutil_tokenize(env, accept_charset_header_value, ',');
+        if (accept_charset_header_field_list && 
+            axutil_array_list_size(accept_charset_header_field_list, env) > 0)
+        {
+            axis2_char_t *token = NULL;
+            accept_charset_record_list =
+                axutil_array_list_create(env,
+                    axutil_array_list_size(accept_charset_header_field_list, env));
+            do
+            {
+                if (token)
+                {
+                    axis2_http_accept_record_t *rec = NULL;
+                    rec = axis2_http_accept_record_create(env, token);
+                    if (rec)
+                    {
+                        axutil_array_list_add(accept_charset_record_list, env, rec);
+                    }
+                    AXIS2_FREE(env->allocator, token);
+                }
+                token = (axis2_char_t *)
+                    axutil_array_list_remove(accept_charset_header_field_list, env, 0);
+            }
+            while(token);
+        }
+        if (accept_charset_record_list && 
+            axutil_array_list_size(accept_charset_record_list, env) > 0)
+        {
+            axis2_msg_ctx_set_http_accept_charset_record_list(msg_ctx, env,
+                accept_charset_record_list);
+        }
     }
 
     axis2_msg_ctx_set_transport_out_stream(msg_ctx, env, out_stream);

Modified: webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c?rev=637997&r1=637996&r2=637997&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c Mon Mar 17 11:03:12 2008
@@ -22,6 +22,7 @@
 #include <axis2_msg_ctx.h>
 #include <axis2_http_out_transport_info.h>
 #include <axis2_http_transport_utils.h>
+#include <axis2_http_accept_record.h>
 #include <axis2_op_ctx.h>
 #include <axis2_engine.h>
 #include <axutil_uuid_gen.h>
@@ -32,6 +33,7 @@
 #include <http_protocol.h>
 #include <axiom_soap.h>
 #include <axutil_class_loader.h>
+#include <axutil_string_util.h>
 
 #define READ_SIZE  2048
 
@@ -167,6 +169,8 @@
     axis2_char_t *peer_ip = NULL;
     axutil_property_t *peer_property = NULL;
     axutil_url_t *request_url = NULL;
+    axis2_char_t *accept_header_value = NULL;
+    axis2_char_t *accept_charset_header_value = NULL;
 
     AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE);
     AXIS2_PARAM_CHECK(env->error, request, AXIS2_CRITICAL_FAILURE);
@@ -263,6 +267,85 @@
     axis2_msg_ctx_set_http_out_transport_info(msg_ctx, env,
                                               apache2_out_transport_info);
 
+    accept_header_value = (axis2_char_t *)
+        apr_table_get(request->headers_in, AXIS2_HTTP_HEADER_ACCEPT);
+    if (accept_header_value)
+    {
+        axutil_array_list_t *accept_header_field_list = NULL;
+        axutil_array_list_t *accept_record_list = NULL;
+        accept_header_field_list = axutil_tokenize(env, accept_header_value, ',');
+        if (accept_header_field_list && 
+            axutil_array_list_size(accept_header_field_list, env) > 0)
+        {
+            axis2_char_t *token = NULL;
+            accept_record_list =
+                axutil_array_list_create(env,
+                    axutil_array_list_size(accept_header_field_list, env));
+            do
+            {
+                if (token)
+                {
+                    axis2_http_accept_record_t *rec = NULL;
+                    rec = axis2_http_accept_record_create(env, token);
+                    if (rec)
+                    {
+                        axutil_array_list_add(accept_record_list, env, rec);
+                    }
+                    AXIS2_FREE(env->allocator, token);
+                }
+                token = (axis2_char_t *)
+                    axutil_array_list_remove(accept_header_field_list, env, 0);
+            }
+            while(token);
+        }
+        if (accept_record_list && 
+            axutil_array_list_size(accept_record_list, env) > 0)
+        {
+            axis2_msg_ctx_set_http_accept_record_list(msg_ctx, env,
+                accept_record_list);
+        }
+    }
+
+    accept_charset_header_value = (axis2_char_t *)
+        apr_table_get(request->headers_in, AXIS2_HTTP_HEADER_ACCEPT_CHARSET);
+    if (accept_charset_header_value)
+    {
+        axutil_array_list_t *accept_charset_header_field_list = NULL;
+        axutil_array_list_t *accept_charset_record_list = NULL;
+        accept_charset_header_field_list =
+            axutil_tokenize(env, accept_charset_header_value, ',');
+        if (accept_charset_header_field_list && 
+            axutil_array_list_size(accept_charset_header_field_list, env) > 0)
+        {
+            axis2_char_t *token = NULL;
+            accept_charset_record_list =
+                axutil_array_list_create(env,
+                    axutil_array_list_size(accept_charset_header_field_list, env));
+            do
+            {
+                if (token)
+                {
+                    axis2_http_accept_record_t *rec = NULL;
+                    rec = axis2_http_accept_record_create(env, token);
+                    if (rec)
+                    {
+                        axutil_array_list_add(accept_charset_record_list, env, rec);
+                    }
+                    AXIS2_FREE(env->allocator, token);
+                }
+                token = (axis2_char_t *)
+                    axutil_array_list_remove(accept_charset_header_field_list, env, 0);
+            }
+            while(token);
+        }
+        if (accept_charset_record_list && 
+            axutil_array_list_size(accept_charset_record_list, env) > 0)
+        {
+            axis2_msg_ctx_set_http_accept_charset_record_list(msg_ctx, env,
+                accept_charset_record_list);
+        }
+    }
+
     soap_action = axutil_string_create(env,
                                        (axis2_char_t *) apr_table_get(request->
                                                                       headers_in,
@@ -590,17 +673,11 @@
     if (send_status == DECLINED)
     {
         axis2_bool_t do_rest = AXIS2_FALSE;
-        axis2_char_t *accept_header_value = NULL;
-        axis2_char_t *accept_charset_header_value = NULL;
         if (M_POST != request->method_number ||
             axis2_msg_ctx_get_doing_rest(msg_ctx, env))
         {
             do_rest = AXIS2_TRUE;
         }
-        accept_header_value = (axis2_char_t *)
-            apr_table_get(request->headers_in, AXIS2_HTTP_HEADER_ACCEPT);
-        accept_charset_header_value = (axis2_char_t *)
-            apr_table_get(request->headers_in, AXIS2_HTTP_HEADER_ACCEPT_CHARSET);
         if ((accept_header_value || accept_charset_header_value) && do_rest)
         {
             axis2_char_t *content_type_header_value = NULL;

Modified: webservices/axis2/trunk/c/src/core/util/core_utils.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/util/core_utils.c?rev=637997&r1=637996&r2=637997&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/util/core_utils.c (original)
+++ webservices/axis2/trunk/c/src/core/util/core_utils.c Mon Mar 17 11:03:12 2008
@@ -89,6 +89,11 @@
         axis2_msg_ctx_set_transport_headers(new_msg_ctx, env,
                 axis2_msg_ctx_extract_transport_headers(in_msg_ctx, env));
     }
+    axis2_msg_ctx_set_http_accept_record_list(new_msg_ctx, env,
+        axis2_msg_ctx_extract_http_accept_record_list(in_msg_ctx, env));
+    axis2_msg_ctx_set_http_accept_charset_record_list(new_msg_ctx, env,
+        axis2_msg_ctx_extract_http_accept_charset_record_list(in_msg_ctx, env));
+
     old_msg_info_headers = axis2_msg_ctx_get_msg_info_headers(in_msg_ctx, env);
     if (!old_msg_info_headers)
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org