blob: 13a011477edd1548839d2e9f3d039f451b9910ee [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <axis2_rest_sender.h>
#include <axis2_string.h>
#include <axis2_http_transport.h>
#include <string.h>
#include <axiom_output.h>
#include <axis2_op_ctx.h>
#include <axis2_ctx.h>
#include <axis2_http_client.h>
#include <axiom_xml_writer.h>
#include <axis2_property.h>
#include <axis2_types.h>
#include <axiom_node.h>
#include <axiom_element.h>
#include <axis2_array_list.h>
#include <axiom_soap_envelope.h>
#include <axiom_soap_body.h>
/**
* @brief REST sender struct impl
* Axis2 REST sender impl
*/
typedef struct axis2_rest_sender_impl
{
axis2_rest_sender_t sender;
axis2_char_t *http_version;
axis2_bool_t chunked;
int so_timeout;
int connection_timeout;
axiom_output_t *om_output;
axis2_http_client_t *client;
}
axis2_rest_sender_impl_t;
#define AXIS2_INTF_TO_IMPL(sender) \
((axis2_rest_sender_impl_t *)(sender))
/***************************** Function headers *******************************/
axis2_status_t AXIS2_CALL
axis2_rest_sender_get_header_info(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_http_simple_response_t *response);
axis2_status_t AXIS2_CALL
axis2_rest_sender_process_response(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_http_simple_response_t *response);
axis2_status_t AXIS2_CALL
axis2_rest_sender_get_timeout_values(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx);
axis2_status_t AXIS2_CALL
axis2_rest_sender_send(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axiom_node_t *out,
const axis2_char_t *str_url);
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_chunked(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_bool_t chunked);
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_om_output(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axiom_output_t *om_output);
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_http_version(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_char_t *version);
axis2_char_t *AXIS2_CALL
axis2_rest_sender_get_param_string(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx);
axis2_status_t AXIS2_CALL
axis2_rest_sender_free(
axis2_rest_sender_t *sender,
const axis2_env_t *env);
axis2_char_t *AXIS2_CALL
axis2_rest_sender_get_param_string(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx);
/***************************** End of function headers ************************/
AXIS2_EXTERN axis2_rest_sender_t *AXIS2_CALL
axis2_rest_sender_create(
const axis2_env_t *env)
{
axis2_rest_sender_impl_t *sender_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
sender_impl = (axis2_rest_sender_impl_t *)AXIS2_MALLOC
(env->allocator, sizeof(
axis2_rest_sender_impl_t));
if (NULL == sender_impl)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
sender_impl->http_version = (axis2_char_t *)AXIS2_HTTP_HEADER_PROTOCOL_11;
sender_impl->so_timeout = AXIS2_HTTP_DEFAULT_SO_TIMEOUT;
sender_impl->connection_timeout = AXIS2_HTTP_DEFAULT_CONNECTION_TIMEOUT;
sender_impl->om_output = NULL;
sender_impl->chunked = AXIS2_FALSE;
sender_impl->client = NULL;
sender_impl->sender.ops = AXIS2_MALLOC(env->allocator,
sizeof(axis2_rest_sender_ops_t));
if (NULL == sender_impl->sender.ops)
{
axis2_rest_sender_free((axis2_rest_sender_t*)
sender_impl, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
sender_impl->sender.ops->send = axis2_rest_sender_send;
sender_impl->sender.ops->set_chunked = axis2_rest_sender_set_chunked;
sender_impl->sender.ops->set_om_output = axis2_rest_sender_set_om_output;
sender_impl->sender.ops->set_http_version =
axis2_rest_sender_set_http_version;
sender_impl->sender.ops->free = axis2_rest_sender_free;
return &(sender_impl->sender);
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_free(
axis2_rest_sender_t *sender,
const axis2_env_t *env)
{
axis2_rest_sender_impl_t *sender_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
sender_impl = AXIS2_INTF_TO_IMPL(sender);
if (sender_impl->http_version)
{
AXIS2_FREE(env->allocator, sender_impl->http_version);
sender_impl->http_version = NULL;
}
if (sender->ops)
AXIS2_FREE(env->allocator, sender->ops);
/* Do not free this here since it will be required in later processing
* of the response soap message
*/
sender_impl->client = NULL;
AXIS2_FREE(env->allocator, sender_impl);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_send(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axiom_node_t *out,
const axis2_char_t *str_url)
{
axis2_http_simple_request_t *request = NULL;
axis2_http_request_line_t *request_line = NULL;
axis2_url_t *url = NULL;
axis2_rest_sender_impl_t *sender_impl = NULL;
axiom_xml_writer_t *xml_writer = NULL;
axis2_char_t *buffer = NULL;
const axis2_char_t *char_set_enc = NULL;
int status_code = -1;
axis2_http_header_t *http_header = NULL;
axis2_http_simple_response_t *response = NULL;
const axis2_char_t *content_type = NULL;
axis2_property_t *property = NULL;
axis2_bool_t send_via_get = AXIS2_FALSE;
axis2_char_t *method = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, out, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, str_url, AXIS2_FAILURE);
url = axis2_url_parse_string(env, str_url);
sender_impl = AXIS2_INTF_TO_IMPL(sender);
if (NULL == url)
{
return AXIS2_FAILURE;
}
if (sender_impl->client)
{
AXIS2_HTTP_CLIENT_FREE(sender_impl->client, env);
sender_impl->client = NULL;
}
sender_impl->client = axis2_http_client_create(env, url);
if (NULL == sender_impl->client)
{
return AXIS2_FAILURE;
}
/* We put the client into msg_ctx so that we can free it once the processing
* is done at client side
*/
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_FREE_FUNC(property, env,
axis2_http_client_free_void_arg);
AXIS2_PROPERTY_SET_VALUE(property, env, sender_impl->client);
AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, AXIS2_HTTP_CLIENT,
property, AXIS2_TRUE);
method = (axis2_char_t *)AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env,
AXIS2_HTTP_METHOD, AXIS2_FALSE);
/* The default is POST */
if (method && 0 == AXIS2_STRCMP(method, AXIS2_HTTP_HEADER_GET))
{
send_via_get = AXIS2_TRUE;
}
if (AXIS2_FALSE == send_via_get)
{
if (NULL == sender_impl->om_output)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NULL_OM_OUTPUT,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
xml_writer = AXIOM_OUTPUT_GET_XML_WRITER(sender_impl->om_output, env);
property = AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env,
AXIS2_CHARACTER_SET_ENCODING, AXIS2_FALSE);
if (property)
{
char_set_enc = AXIS2_PROPERTY_GET_VALUE(property, env);
property = NULL;
}
if (NULL == char_set_enc)
{
char_set_enc = AXIS2_DEFAULT_CHAR_SET_ENCODING;
}
/* AXIOM_OUTPUT_SET_DO_OPTIMIZE(om_output, env,
* AXIS2_MSG_CTX_GET_IS_DOING_MTOM(msg_ctx, env);
*/
AXIOM_NODE_SERIALIZE(out, env, sender_impl->om_output);
buffer = AXIOM_XML_WRITER_GET_XML(xml_writer, env);
if (NULL == buffer)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "NULL xml returned"
"from xml writer");
return AXIS2_FAILURE;
}
request_line = axis2_http_request_line_create(env, "POST",
AXIS2_URL_GET_PATH(url, env),
sender_impl->http_version);
}
else
{
axis2_char_t *request_params = NULL;
axis2_char_t *path = NULL;
request_params = axis2_rest_sender_get_param_string(sender, env,
msg_ctx);
path = axis2_strcat(env, AXIS2_URL_GET_PATH(url, env), "?",
request_params, NULL);
request_line = axis2_http_request_line_create(env, "GET", path,
sender_impl->http_version);
}
request = axis2_http_simple_request_create(env, request_line, NULL, 0,
NULL);
http_header = axis2_http_header_create(env, AXIS2_HTTP_HEADER_USER_AGENT,
"Axis2/C");
AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(request, env, http_header);
if (AXIS2_FALSE == send_via_get)
{
if (AXIS2_FALSE == sender_impl->chunked)
{
axis2_char_t tmp_buf[10];
sprintf(tmp_buf, "%d", (int)strlen(buffer));
http_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH, tmp_buf);
AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(request, env, http_header);
}
else
{
http_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED);
AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(request, env, http_header);
}
/* TODO we need to set the content type with soap action header for soap12*/
content_type = AXIS2_HTTP_HEADER_ACCEPT_TEXT_XML;
http_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_TYPE, content_type);
AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(request, env, http_header);
AXIS2_HTTP_SIMPLE_REQUEST_SET_BODY_STRING(request, env, buffer);
}
if (0 == AXIS2_STRCMP(sender_impl->http_version,
AXIS2_HTTP_HEADER_PROTOCOL_11))
{
axis2_char_t *header = NULL;
header = AXIS2_MALLOC(env->allocator, AXIS2_STRLEN(
AXIS2_URL_GET_SERVER(url, env)) + 10 * sizeof(
axis2_char_t));
sprintf(header, "%s:%d", AXIS2_URL_GET_SERVER(url, env),
AXIS2_URL_GET_PORT(url, env));
http_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_HOST,
header);
AXIS2_FREE(env->allocator, header);
header = NULL;
AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(request, env, http_header);
}
axis2_rest_sender_get_timeout_values(sender, env, msg_ctx);
AXIS2_HTTP_CLIENT_SET_TIMEOUT(sender_impl->client, env,
sender_impl->so_timeout);
status_code = AXIS2_HTTP_CLIENT_SEND(sender_impl->client, env, request);
AXIS2_FREE(env->allocator, buffer);
buffer = NULL;
AXIS2_HTTP_SIMPLE_REQUEST_FREE(request, env);
request = NULL;
status_code = AXIS2_HTTP_CLIENT_RECIEVE_HEADER(sender_impl->client, env);
if (status_code < 0)
{
return AXIS2_FAILURE;
}
response = AXIS2_HTTP_CLIENT_GET_RESPONSE(sender_impl->client, env);
if (AXIS2_HTTP_RESPONSE_OK_CODE_VAL == status_code ||
AXIS2_HTTP_RESPONSE_ACK_CODE_VAL == status_code)
{
return axis2_rest_sender_process_response(sender, env,
msg_ctx, response);
}
else if (AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR_CODE_VAL == status_code)
{
axis2_http_header_t *tmp_header = NULL;
axis2_char_t *tmp_header_val = NULL;
tmp_header = AXIS2_HTTP_SIMPLE_RESPONSE_GET_FIRST_HEADER(response, env,
AXIS2_HTTP_HEADER_CONTENT_TYPE);
if (tmp_header)
{
tmp_header_val = AXIS2_HTTP_HEADER_GET_VALUE(tmp_header, env);
}
if (tmp_header_val && (AXIS2_STRSTR(tmp_header_val,
AXIS2_HTTP_HEADER_ACCEPT_APPL_SOAP) || AXIS2_STRSTR(
tmp_header_val, AXIS2_HTTP_HEADER_ACCEPT_TEXT_XML)))
{
return axis2_rest_sender_process_response(sender, env,
msg_ctx, response);
}
}
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_HTTP_CLIENT_TRANSPORT_ERROR,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_chunked(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_bool_t chunked)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(sender)->chunked = chunked;
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_om_output(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axiom_output_t *om_output)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(sender)->om_output = om_output;
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_get_header_info(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_http_simple_response_t *response)
{
axis2_array_list_t *headers = NULL;
axis2_char_t *charset = NULL;
axis2_rest_sender_impl_t *sender_impl = NULL;
int i = 0;
axis2_bool_t response_chunked = AXIS2_FALSE;
int *content_length = NULL;
axis2_property_t *property = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, response, AXIS2_FAILURE);
sender_impl = AXIS2_INTF_TO_IMPL(sender);
/*
* TODO MTOM support (MIME header)
*/
headers = AXIS2_HTTP_SIMPLE_RESPONSE_GET_HEADERS(response, env);
if (headers == NULL)
{
return AXIS2_SUCCESS;
}
for (i = 0; i < AXIS2_ARRAY_LIST_SIZE(headers, env); i++)
{
axis2_http_header_t *header = AXIS2_ARRAY_LIST_GET(headers, env, i);
axis2_char_t *name = AXIS2_HTTP_HEADER_GET_NAME((axis2_http_header_t *)
header, env);
if (name)
{
if (0 == AXIS2_STRCMP(name, AXIS2_HTTP_HEADER_TRANSFER_ENCODING) &&
0 == AXIS2_STRCMP(AXIS2_HTTP_HEADER_GET_VALUE(header
, env), AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED))
{
axis2_char_t *transfer_encoding = NULL;
transfer_encoding =
AXIS2_STRDUP(AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED,
env);
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_VALUE(property, env, transfer_encoding);
AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING,
property,
AXIS2_FALSE);
response_chunked = AXIS2_TRUE;
}
if (0 != AXIS2_STRCMP(name, AXIS2_HTTP_HEADER_CONTENT_TYPE))
{
axis2_char_t *tmp_charset = NULL;
axis2_char_t *content_type = AXIS2_HTTP_HEADER_GET_VALUE(header,
env);
tmp_charset = strstr(content_type, AXIS2_HTTP_CHAR_SET_ENCODING);
if (charset)
{
charset = AXIS2_STRDUP(tmp_charset, env);
break;
}
}
}
}
if (charset)
{
axis2_ctx_t *axis_ctx = AXIS2_OP_CTX_GET_BASE(AXIS2_MSG_CTX_GET_OP_CTX(
msg_ctx, env), env);
if (axis_ctx)
{
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_VALUE(property, env, charset);
AXIS2_CTX_SET_PROPERTY(axis_ctx, env, AXIS2_CHARACTER_SET_ENCODING,
property, AXIS2_FALSE);
}
}
if (AXIS2_FALSE == response_chunked)
{
int tmp_len = 0;
content_length = AXIS2_MALLOC(env->allocator, sizeof(int));
if (NULL == content_length)
{
return AXIS2_FAILURE;
}
tmp_len = AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(response, env);
memcpy(content_length, &tmp_len, sizeof(int));
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_VALUE(property, env, content_length);
AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH, property,
AXIS2_FALSE);
}
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_process_response(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_http_simple_response_t *response)
{
axis2_stream_t *in_stream = NULL;
axis2_property_t *property = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, response, AXIS2_FAILURE);
in_stream = AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY(response, env);
if (NULL == in_stream)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NULL_STREAM_IN_RESPONSE_BODY,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
axis2_rest_sender_get_header_info(sender, env, msg_ctx, response);
/*axis_ctx = AXIS2_OP_CTX_GET_BASE(AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env),
env);*/
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_FREE_FUNC(property, env, axis2_stream_free_void_arg);
AXIS2_PROPERTY_SET_VALUE(property, env, in_stream);
/*AXIS2_CTX_SET_PROPERTY(axis_ctx, env, AXIS2_TRANSPORT_IN, property,
AXIS2_FALSE);*/
AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, AXIS2_TRANSPORT_IN, property,
AXIS2_FALSE);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_get_timeout_values(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx)
{
axis2_char_t *so_str = NULL;
axis2_char_t *connection_str = NULL;
axis2_param_t *tmp_param = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
tmp_param = AXIS2_MSG_CTX_GET_PARAMETER(msg_ctx,
env, AXIS2_HTTP_SO_TIMEOUT);
if (tmp_param)
{
so_str = (axis2_char_t*)AXIS2_PARAM_GET_VALUE(tmp_param, env);
if (so_str)
{
AXIS2_INTF_TO_IMPL(sender)->so_timeout = AXIS2_ATOI(so_str);
}
}
tmp_param = AXIS2_MSG_CTX_GET_PARAMETER(msg_ctx, env,
AXIS2_HTTP_CONNECTION_TIMEOUT);
if (tmp_param)
{
connection_str = (axis2_char_t *)AXIS2_PARAM_GET_VALUE(tmp_param, env);
if (connection_str)
{
AXIS2_INTF_TO_IMPL(sender)->connection_timeout =
AXIS2_ATOI(connection_str);
}
}
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_rest_sender_set_http_version(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_char_t *version)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(sender)->http_version = AXIS2_STRDUP(version, env);
if (NULL == AXIS2_INTF_TO_IMPL(sender)->http_version)
{
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
axis2_char_t *AXIS2_CALL
axis2_rest_sender_get_param_string(
axis2_rest_sender_t *sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx)
{
axiom_soap_envelope_t *soap_env = NULL;
axiom_node_t *body_node = NULL;
axiom_node_t *data_node = NULL;
axiom_element_t *data_element = NULL;
axiom_child_element_iterator_t *iterator = NULL;
axis2_array_list_t *param_list = NULL;
axis2_char_t *param_string = NULL;
int i = 0;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, msg_ctx, NULL);
soap_env = AXIS2_MSG_CTX_GET_SOAP_ENVELOPE(msg_ctx, env);
if (NULL == soap_env)
{
return NULL;
}
body_node = AXIOM_SOAP_BODY_GET_BASE_NODE(
AXIOM_SOAP_ENVELOPE_GET_BODY(soap_env, env), env);
data_node = AXIOM_NODE_GET_FIRST_CHILD(body_node, env);
if (NULL == data_node)
{
return NULL;
}
param_list = axis2_array_list_create(env, AXIS2_ARRAY_LIST_DEFAULT_CAPACITY);
data_element = AXIOM_NODE_GET_DATA_ELEMENT(data_node, env);
iterator = AXIOM_ELEMENT_GET_CHILD_ELEMENTS(data_element, env, data_node);
while (AXIS2_TRUE == AXIOM_CHILD_ELEMENT_ITERATOR_HAS_NEXT(iterator, env))
{
axiom_node_t *node = NULL;
axiom_element_t *element = NULL;
axis2_char_t *name = NULL;
axis2_char_t *value = NULL;
node = AXIOM_CHILD_ELEMENT_ITERATOR_NEXT(iterator, env);
element = AXIOM_NODE_GET_DATA_ELEMENT(node, env);
name = AXIOM_ELEMENT_GET_LOCALNAME(element, env);
value = AXIOM_ELEMENT_GET_TEXT(element, env, node);
AXIS2_ARRAY_LIST_ADD(param_list, env, axis2_strcat(env, name, "=",
value, NULL));
}
for (i = 0; i < AXIS2_ARRAY_LIST_SIZE(param_list, env); i++)
{
axis2_char_t *tmp_string = NULL;
axis2_char_t *pair = NULL;
pair = AXIS2_ARRAY_LIST_GET(param_list, env, i);
tmp_string = AXIS2_STRACAT(param_string, pair, env);
if (param_string)
{
AXIS2_FREE(env->allocator, param_string);
param_string = NULL;
}
AXIS2_FREE(env->allocator, pair);
param_string = tmp_string;
}
AXIS2_ARRAY_LIST_FREE(param_list, env);
return param_string;
}