blob: df8bce4d83e0cf8a994ec2000acecb228c4457f2 [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_http_transport_sender.h>
#include <axis2_string.h>
#include <axis2_endpoint_ref.h>
#include <axis2_addr.h>
#include <axiom_xml_writer.h>
#include <axiom_output.h>
#include <axis2_http_transport_utils.h>
#include <axis2_http_out_transport_info.h>
#include <axis2_http_transport.h>
#include <axis2_soap_over_http_sender.h>
#include <axiom_soap_body.h>
#include <axis2_rest_sender.h>
#include <axis2_types.h>
/**
* HTTP Transport Sender struct impl
* Axis2 HTTP Transport Sender impl
*/
typedef struct axis2_http_transport_sender_impl
{
axis2_transport_sender_t transport_sender;
axis2_char_t *http_version;
axis2_bool_t chunked;
int connection_timeout;
int so_timeout;
}
axis2_http_transport_sender_impl_t;
#define AXIS2_INTF_TO_IMPL(transport_sender) \
((axis2_http_transport_sender_impl_t *)\
(transport_sender))
/***************************** Function headers *******************************/
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_invoke(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx);
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_clean_up(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx);
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_init(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_conf_ctx_t *conf_ctx,
axis2_transport_out_desc_t *out_desc);
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_write_message(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_endpoint_ref_t *epr,
axiom_soap_envelope_t *out,
axiom_output_t *om_output);
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_free(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env);
/***************************** End of function headers ************************/
axis2_transport_sender_t *AXIS2_CALL
axis2_http_transport_sender_create(
const axis2_env_t *env)
{
axis2_http_transport_sender_impl_t *transport_sender_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
transport_sender_impl = (axis2_http_transport_sender_impl_t *)AXIS2_MALLOC
(env->allocator, sizeof(
axis2_http_transport_sender_impl_t));
if (NULL == transport_sender_impl)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
transport_sender_impl->http_version = AXIS2_STRDUP(
AXIS2_HTTP_HEADER_PROTOCOL_11, env);
transport_sender_impl->chunked = AXIS2_TRUE;
transport_sender_impl->connection_timeout =
AXIS2_HTTP_DEFAULT_CONNECTION_TIMEOUT;
transport_sender_impl->so_timeout = AXIS2_HTTP_DEFAULT_SO_TIMEOUT;
transport_sender_impl->transport_sender.ops = AXIS2_MALLOC(env->allocator
, sizeof(axis2_transport_sender_ops_t));
if (NULL == transport_sender_impl->transport_sender.ops)
{
axis2_http_transport_sender_free((axis2_transport_sender_t *)
transport_sender_impl, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
transport_sender_impl->transport_sender.ops->invoke =
axis2_http_transport_sender_invoke;
transport_sender_impl->transport_sender.ops->cleanup =
axis2_http_transport_sender_clean_up;
transport_sender_impl->transport_sender.ops->init =
axis2_http_transport_sender_init;
transport_sender_impl->transport_sender.ops->free =
axis2_http_transport_sender_free;
return &(transport_sender_impl->transport_sender);
}
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_free(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env)
{
axis2_http_transport_sender_impl_t *transport_sender_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
transport_sender_impl = AXIS2_INTF_TO_IMPL(transport_sender);
if (transport_sender_impl->http_version)
{
AXIS2_FREE(env->allocator, transport_sender_impl->http_version);
transport_sender_impl->http_version = NULL;
}
if (transport_sender->ops)
AXIS2_FREE(env->allocator, transport_sender->ops);
AXIS2_FREE(env->allocator, transport_sender_impl);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_invoke(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx)
{
const axis2_char_t *char_set_enc = NULL;
axis2_endpoint_ref_t *epr = NULL;
axis2_char_t *transport_url = NULL;
axiom_xml_writer_t *xml_writer = NULL;
axiom_output_t *om_output = NULL;
axis2_char_t *buffer = NULL;
axiom_soap_envelope_t *soap_data_out = NULL;
axis2_bool_t do_mtom;
axis2_property_t *property = NULL;
axiom_node_t *data_out = NULL;
axis2_byte_t *output_stream = NULL;
int buffer_size = 0;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
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)
{
axis2_op_ctx_t *op_ctx = AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env);
if (op_ctx)
{
axis2_ctx_t *ctx = AXIS2_OP_CTX_GET_BASE(op_ctx, env);
if (ctx)
{
property = AXIS2_CTX_GET_PROPERTY(ctx, env,
AXIS2_CHARACTER_SET_ENCODING, AXIS2_FALSE);
if (property)
{
char_set_enc = AXIS2_PROPERTY_GET_VALUE(property, env);
property = NULL;
}
}
}
}
/**
* If we still can't find the char set enc we will
* use default
*/
if (NULL == char_set_enc)
{
char_set_enc = AXIS2_DEFAULT_CHAR_SET_ENCODING;
}
do_mtom = axis2_http_transport_utils_do_write_mtom(env,
msg_ctx);
AXIS2_MSG_CTX_SET_DOING_MTOM(msg_ctx, env, do_mtom);
/*do_mtom = AXIS2_MSG_CTX_GET_DOING_MTOM(msg_ctx, env);*/
/*AXIS2_MSG_CTX_SET_DOING_REST(msg_ctx,
env, axis2_http_transport_utils_is_doing_rest(env,
msg_ctx));*/
property = (axis2_property_t *)AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env,
AXIS2_TRANSPORT_URL, AXIS2_FALSE);
if (property)
{
transport_url = (axis2_char_t *) AXIS2_PROPERTY_GET_VALUE(property, env);
property = NULL;
}
if (transport_url)
{
epr = axis2_endpoint_ref_create(env, transport_url);
}
else
{
axis2_endpoint_ref_t *ctx_epr = AXIS2_MSG_CTX_GET_TO(msg_ctx, env);
if (ctx_epr && 0 != AXIS2_STRCMP(
AXIS2_WSA_ANONYMOUS_URL_SUBMISSION,
AXIS2_ENDPOINT_REF_GET_ADDRESS(ctx_epr, env)) &&
0 != AXIS2_STRCMP(AXIS2_WSA_ANONYMOUS_URL,
AXIS2_ENDPOINT_REF_GET_ADDRESS(ctx_epr, env)))
{
epr = ctx_epr;
}
}
soap_data_out = AXIS2_MSG_CTX_GET_SOAP_ENVELOPE(msg_ctx, env);
if (NULL == soap_data_out)
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_NULL_SOAP_ENVELOPE_IN_MSG_CTX,
AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "%s",
AXIS2_ERROR_GET_MESSAGE(env->error));
return AXIS2_FAILURE;
}
xml_writer = axiom_xml_writer_create_for_memory(env, NULL,
AXIS2_TRUE, 0, AXIS2_XML_PARSER_TYPE_BUFFER);
if (NULL == xml_writer)
{
return AXIS2_FAILURE;
}
om_output = axiom_output_create(env, xml_writer);
if (NULL == om_output)
{
AXIOM_XML_WRITER_FREE(xml_writer, env);
xml_writer = NULL;
return AXIS2_FAILURE;
}
AXIOM_OUTPUT_SET_SOAP11(om_output, env, AXIS2_MSG_CTX_GET_IS_SOAP_11(msg_ctx, env));
if (epr)
{
if (AXIS2_STRCMP(AXIS2_WSA_NONE_URL_SUBMISSION, AXIS2_ENDPOINT_REF_GET_ADDRESS(epr, env)) == 0 ||
AXIS2_STRCMP(AXIS2_WSA_NONE_URL, AXIS2_ENDPOINT_REF_GET_ADDRESS(epr, env)) == 0)
{
epr = NULL;
}
else
{
axis2_http_transport_sender_write_message(transport_sender, env, msg_ctx
, epr, soap_data_out, om_output);
}
}
if (!epr)
{
axis2_stream_t *out_stream = NULL;
property = AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env,
AXIS2_TRANSPORT_OUT, AXIS2_FALSE);
if (property)
{
out_stream = AXIS2_PROPERTY_GET_VALUE(property, env);
property = NULL;
}
if (AXIS2_TRUE == AXIS2_MSG_CTX_GET_SERVER_SIDE(msg_ctx, env))
{
axis2_op_ctx_t *op_ctx = NULL;
axis2_ctx_t *ctx = NULL;
axis2_http_out_transport_info_t *out_info = NULL;
axis2_bool_t is_soap11 = AXIS2_FALSE;
property = AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env,
AXIS2_HTTP_OUT_TRANSPORT_INFO, AXIS2_FALSE);
if (property)
{
out_info = (axis2_http_out_transport_info_t *)
AXIS2_PROPERTY_GET_VALUE(property, env);
property = NULL;
}
if (NULL == out_info)
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_OUT_TRNSPORT_INFO_NULL, AXIS2_FAILURE);
AXIOM_OUTPUT_FREE(om_output, env);
om_output = NULL;
xml_writer = NULL;
return AXIS2_FAILURE;
}
is_soap11 = AXIS2_MSG_CTX_GET_IS_SOAP_11(msg_ctx, env);
/* AXIOM_OUTPUT_SET_SOAP11(om_output, env, is_soap_11);
*/
AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CHAR_ENCODING(out_info, env,
char_set_enc);
if (AXIS2_TRUE == is_soap11)
{
AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CONTENT_TYPE(out_info, env,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_XML);
}
else
{
AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CONTENT_TYPE(out_info, env,
AXIS2_HTTP_HEADER_ACCEPT_APPL_SOAP);
}
/*
AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CONTENT_TYPE(out_info, env,
AXIOM_OUTPUT_GET_CONTENT_TYPE(om_output, env));*/
/* AXIOM_OUTPUT_SET_DO_OPTIMIZE(om_output, env,
* AXIS2_MSG_CTX_GET_IS_DOING_MTOM(msg_ctx, env);
*/
if (AXIS2_TRUE == AXIS2_MSG_CTX_GET_DOING_REST(msg_ctx, env))
{
axiom_node_t *body_node = NULL;
axiom_soap_body_t *soap_body = AXIOM_SOAP_ENVELOPE_GET_BODY(
soap_data_out, env);
if (NULL == soap_body)
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_SOAP_ENVELOPE_OR_SOAP_BODY_NULL,
AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "%s",
AXIS2_ERROR_GET_MESSAGE(env->error));
AXIOM_OUTPUT_FREE(om_output, env);
om_output = NULL;
xml_writer = NULL;
return AXIS2_FAILURE;
}
body_node = AXIOM_SOAP_BODY_GET_BASE_NODE(soap_body, env);
if (NULL == body_node)
{
AXIOM_OUTPUT_FREE(om_output, env);
om_output = NULL;
xml_writer = NULL;
return AXIS2_FAILURE;
}
data_out = AXIOM_NODE_GET_FIRST_CHILD(body_node, env);
if (NULL == data_out || AXIOM_NODE_GET_NODE_TYPE(data_out, env)
!= AXIOM_ELEMENT)
{
AXIOM_OUTPUT_FREE(om_output, env);
om_output = NULL;
xml_writer = NULL;
return AXIS2_FAILURE;
}
AXIOM_NODE_SERIALIZE(data_out, env, om_output);
buffer = (axis2_char_t*)AXIOM_XML_WRITER_GET_XML(xml_writer, env);
buffer_size = AXIS2_STRLEN(buffer);
}
else
{
AXIOM_OUTPUT_SET_DO_OPTIMIZE(om_output, env,
do_mtom);
AXIOM_SOAP_ENVELOPE_SERIALIZE(soap_data_out, env, om_output,
AXIS2_FALSE);
if (do_mtom)
{
axis2_char_t *content_type = NULL;
AXIOM_OUTPUT_FLUSH(om_output, env, &output_stream,
&buffer_size);
content_type = (axis2_char_t *)AXIOM_OUTPUT_GET_CONTENT_TYPE(
om_output,
env);
AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CONTENT_TYPE(out_info,
env, content_type);
buffer = output_stream;
}
else
{
buffer = (axis2_char_t *)AXIOM_XML_WRITER_GET_XML(xml_writer, env);
buffer_size = AXIS2_STRLEN(buffer);
}
}
AXIS2_STREAM_WRITE(out_stream, env, buffer, buffer_size);
AXIS2_FREE(env->allocator, buffer);
op_ctx = AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env);
if (op_ctx)
{
ctx = AXIS2_OP_CTX_GET_BASE(op_ctx, env);
if (ctx)
{
axis2_char_t *value = NULL;
value = AXIS2_STRDUP("TRUE", env);
property = axis2_property_create(env);
AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
AXIS2_PROPERTY_SET_VALUE(property, env, value);
AXIS2_CTX_SET_PROPERTY(ctx, env, AXIS2_RESPONSE_WRITTEN,
property, AXIS2_FALSE);
}
}
}
}
AXIOM_OUTPUT_FREE(om_output, env);
om_output = NULL;
xml_writer = NULL;
if (transport_url)
{
if (epr)
{
AXIS2_ENDPOINT_REF_FREE(epr, env);
epr = NULL;
}
}
/*
* TODO handle errors
*/
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_clean_up(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
/*
* Clean up is not used. If the http sender needs
* to be cleaned up it should be done here.
*/
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_init(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_conf_ctx_t *conf_ctx,
axis2_transport_out_desc_t *out_desc)
{
axis2_param_t *version_param = NULL;
axis2_char_t *version = NULL;
axis2_char_t *temp = NULL;
axis2_param_t *temp_param = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, out_desc, AXIS2_FAILURE);
version_param = AXIS2_PARAM_CONTAINER_GET_PARAM(
out_desc->param_container, env,
AXIS2_HTTP_PROTOCOL_VERSION);
if (version_param)
{
version = AXIS2_PARAM_GET_VALUE(version_param, env);
}
if (version)
{
if (0 == AXIS2_STRCMP(version, AXIS2_HTTP_HEADER_PROTOCOL_11))
{
axis2_char_t *encoding = NULL;
axis2_param_t *encoding_param = NULL;
if (AXIS2_INTF_TO_IMPL(transport_sender)->http_version)
{
AXIS2_FREE(env->allocator,
AXIS2_INTF_TO_IMPL(transport_sender)->http_version);
}
AXIS2_INTF_TO_IMPL(transport_sender)->http_version = AXIS2_STRDUP(
version, env);
encoding_param = AXIS2_PARAM_CONTAINER_GET_PARAM(
out_desc->param_container, env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING);
if (encoding_param)
{
encoding = AXIS2_PARAM_GET_VALUE(encoding_param, env);
}
if (encoding && 0 == AXIS2_STRCMP(encoding,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED))
{
AXIS2_INTF_TO_IMPL(transport_sender)->chunked = AXIS2_TRUE;
}
else
{
AXIS2_INTF_TO_IMPL(transport_sender)->chunked = AXIS2_FALSE;
}
}
else if (0 == AXIS2_STRCMP(version, AXIS2_HTTP_HEADER_PROTOCOL_10))
{
if (AXIS2_INTF_TO_IMPL(transport_sender)->http_version)
{
AXIS2_FREE(env->allocator,
AXIS2_INTF_TO_IMPL(transport_sender)->http_version);
}
AXIS2_INTF_TO_IMPL(transport_sender)->http_version = AXIS2_STRDUP(
version, env);
AXIS2_INTF_TO_IMPL(transport_sender)->chunked = AXIS2_FALSE;
}
}
else
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NULL_HTTP_VERSION,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
temp_param = AXIS2_PARAM_CONTAINER_GET_PARAM(
out_desc->param_container, env,
AXIS2_HTTP_SO_TIMEOUT);
if (temp_param)
{
temp = AXIS2_PARAM_GET_VALUE(temp_param, env);
}
if (temp)
{
AXIS2_INTF_TO_IMPL(transport_sender)->so_timeout = AXIS2_ATOI(temp);
}
temp = (axis2_char_t *)AXIS2_PARAM_CONTAINER_GET_PARAM(
out_desc->param_container, env,
AXIS2_HTTP_CONNECTION_TIMEOUT);
if (temp_param)
{
temp = AXIS2_PARAM_GET_VALUE(temp_param, env);
}
if (temp)
{
AXIS2_INTF_TO_IMPL(transport_sender)->connection_timeout =
AXIS2_ATOI(temp);
}
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_http_transport_sender_write_message(
axis2_transport_sender_t *transport_sender,
const axis2_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_endpoint_ref_t *epr,
axiom_soap_envelope_t *out,
axiom_output_t *om_output)
{
const axis2_char_t *soap_action = NULL;
const axis2_char_t *url = NULL;
axis2_soap_over_http_sender_t *sender = NULL;
axis2_status_t status = AXIS2_FAILURE;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, epr, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, om_output, AXIS2_FAILURE);
url = AXIS2_ENDPOINT_REF_GET_ADDRESS(epr, env);
soap_action = AXIS2_MSG_CTX_GET_SOAP_ACTION(msg_ctx, env);
/*hack if (NULL == soap_action || 0 == AXIS2_STRLEN(soap_action))
{
soap_action = AXIS2_MSG_CTX_GET_WSA_ACTION(msg_ctx, env);
}*/
if (NULL == soap_action)
{
soap_action = "";
}
if (AXIS2_TRUE == AXIS2_MSG_CTX_GET_DOING_REST(msg_ctx, env))
{
axiom_node_t *data_out = NULL;
axiom_node_t *body_node = NULL;
axiom_soap_body_t *soap_body = AXIOM_SOAP_ENVELOPE_GET_BODY(out, env);
axis2_rest_sender_t *sender = NULL;
if (NULL == soap_body)
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_SOAP_ENVELOPE_OR_SOAP_BODY_NULL,
AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "%s",
AXIS2_ERROR_GET_MESSAGE(env->error));
return AXIS2_FAILURE;
}
body_node = AXIOM_SOAP_BODY_GET_BASE_NODE(soap_body, env);
if (NULL == body_node)
{
return AXIS2_FAILURE;
}
data_out = AXIOM_NODE_GET_FIRST_CHILD(body_node, env);
if (NULL == data_out || AXIOM_NODE_GET_NODE_TYPE(data_out, env)
!= AXIOM_ELEMENT)
{
return AXIS2_FAILURE;
}
sender = axis2_rest_sender_create(env);
AXIS2_REST_SENDER_SET_CHUNKED(sender, env,
AXIS2_INTF_TO_IMPL(transport_sender)->chunked);
AXIS2_REST_SENDER_SET_OM_OUTPUT(sender, env, om_output);
AXIS2_REST_SENDER_SET_HTTP_VERSION(sender, env,
AXIS2_INTF_TO_IMPL(transport_sender)->http_version);
status = AXIS2_REST_SENDER_SEND(sender, env, msg_ctx, data_out, url);
}
else
{
sender = axis2_soap_over_http_sender_create(env);
if (NULL == sender)
{
return AXIS2_FAILURE;
}
AXIS2_SOAP_OVER_HTTP_SENDER_SET_CHUNKED(sender, env,
AXIS2_INTF_TO_IMPL(transport_sender)->chunked);
AXIS2_SOAP_OVER_HTTP_SENDER_SET_OM_OUTPUT(sender, env, om_output);
AXIOM_SOAP_OVER_SENDER_SET_HTTP_VERSION(sender, env,
AXIS2_INTF_TO_IMPL(transport_sender)->http_version);
status = AXIS2_SOAP_OVER_HTTP_SENDER_SEND(sender, env, msg_ctx, out, url
, soap_action);
/*
* TODO check for errors
*/
AXIS2_SOAP_OVER_HTTP_SENDER_FREE(sender, env);
sender = NULL;
}
return status;
}
/**
* Following block distinguish the exposed part of the dll.
*/
AXIS2_EXPORT int
axis2_get_instance(
struct axis2_transport_sender **inst,
const axis2_env_t *env)
{
*inst = axis2_http_transport_sender_create(env);
if (!(*inst))
{
printf("transport sender load not success\n");
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXPORT int
axis2_remove_instance(
axis2_transport_sender_t *inst,
const axis2_env_t *env)
{
axis2_status_t status = AXIS2_FAILURE;
if (inst)
{
status = AXIS2_TRANSPORT_SENDER_FREE(inst, env);
}
return status;
}