blob: 7ce258a0207c6cc2257004835063cdac88a83b7a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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_worker.h>
#include <axutil_string.h>
#include <axis2_http_transport.h>
#include <axis2_conf.h>
#include <axutil_string.h>
#include <axis2_msg_ctx.h>
#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>
#include <axutil_url.h>
#include <axutil_property.h>
#include <axiom_soap.h>
#include <string.h>
#include <axutil_string_util.h>
#include <stdio.h>
#include <stdlib.h>
#include <platforms/axutil_platform_auto_sense.h>
struct axis2_http_worker
{
axis2_conf_ctx_t *conf_ctx;
int svr_port;
axis2_bool_t is_application_client_side;
};
static axis2_status_t
axis2_http_worker_set_response_headers(
axis2_http_worker_t * http_worker,
const axutil_env_t * env,
axis2_simple_http_svr_conn_t * svr_conn,
axis2_http_simple_request_t * simple_request,
axis2_http_simple_response_t * simple_response,
axis2_ssize_t content_length);
static axutil_hash_t *
axis2_http_worker_get_headers(
axis2_http_worker_t * http_worker,
const axutil_env_t * env,
axis2_http_simple_request_t * request);
static axis2_http_simple_response_t *
axis2_http_worker_create_simple_response(
axis2_http_worker_t *http_worker,
const axutil_env_t *env);
AXIS2_EXTERN axis2_http_worker_t *AXIS2_CALL
axis2_http_worker_create(
const axutil_env_t * env,
axis2_conf_ctx_t * conf_ctx)
{
axis2_http_worker_t *http_worker = NULL;
http_worker = (axis2_http_worker_t *)AXIS2_MALLOC(env->allocator, sizeof(axis2_http_worker_t));
if(!http_worker)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
http_worker->conf_ctx = conf_ctx;
http_worker->svr_port = 9090; /* default - must set later */
http_worker->is_application_client_side = AXIS2_FALSE; /* default is creating for application
server side */
return http_worker;
}
AXIS2_EXTERN void AXIS2_CALL
axis2_http_worker_free(
axis2_http_worker_t * http_worker,
const axutil_env_t * env)
{
http_worker->conf_ctx = NULL;
AXIS2_FREE(env->allocator, http_worker);
return;
}
/* Each in-coming request is passed into this function for process. Basically http method to deliver
* is deduced here and call appropriate http processing function.
* eg. transport_utils_process_http_post_request() function. Once this function call done it will go
* through engine inflow phases and finally hit the message receiver for the operation.
*/
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axis2_http_worker_process_request(
axis2_http_worker_t * http_worker,
const axutil_env_t * env,
axis2_simple_http_svr_conn_t * svr_conn,
axis2_http_simple_request_t * simple_request)
{
axis2_conf_ctx_t *conf_ctx = NULL;
axis2_msg_ctx_t *msg_ctx = NULL;
axutil_stream_t *request_body = NULL;
/* Creating out_stream as basic stream */
axutil_stream_t *out_stream = axutil_stream_create_basic(env);
axis2_http_simple_response_t *response = NULL;
/* Transport in and out descriptions */
axis2_transport_out_desc_t *out_desc = NULL;
axis2_transport_in_desc_t *in_desc = NULL;
axis2_char_t *http_version = NULL;
axis2_char_t *soap_action = NULL;
axutil_string_t *soap_action_str = NULL;
axis2_bool_t processed = AXIS2_FALSE;
axis2_status_t status = AXIS2_FAILURE;
int content_length = -1;
axis2_http_header_t *encoding_header = NULL;
axis2_char_t *encoding_header_value = NULL;
axis2_op_ctx_t *op_ctx = NULL;
axis2_char_t *svr_ip = NULL;
axis2_char_t *peer_ip = NULL;
axutil_url_t *request_url = NULL;
axis2_http_out_transport_info_t *http_out_transport_info = NULL;
axutil_hash_t *headers = NULL;
axis2_char_t *url_external_form = NULL;
axis2_char_t *svc_grp_uuid = NULL;
axis2_char_t *path = NULL;
axutil_property_t *peer_property = NULL;
/* REST processing variables */
axis2_bool_t is_get = AXIS2_FALSE;
axis2_bool_t is_head = AXIS2_FALSE;
axis2_bool_t is_put = AXIS2_FALSE;
axis2_bool_t is_delete = AXIS2_FALSE;
axis2_bool_t request_handled = AXIS2_FALSE;
/* HTTP and Proxy authentication */
axis2_char_t *cookie_header_value = NULL;
/*axis2_char_t *set_cookie_header_value = NULL;
axis2_http_header_t *set_cookie_header = NULL;
axis2_http_header_t *connection_header = NULL;*/
axis2_http_header_t *cookie_header = NULL;
axis2_char_t *accept_header_value = NULL;
axis2_http_header_t *accept_header = NULL;
axis2_char_t *accept_charset_header_value = NULL;
axis2_http_header_t *accept_charset_header = NULL;
axis2_char_t *accept_language_header_value = NULL;
axis2_http_header_t *accept_language_header = NULL;
axis2_char_t *http_method = NULL;
axis2_http_request_line_t *request_line = NULL;
axutil_hash_t *request_params = NULL;
axis2_char_t *request_uri = NULL;
axis2_char_t *url_ext_form = NULL;
const axis2_char_t *content_type = NULL;
axis2_msg_ctx_t *out_msg_ctx = NULL;
axis2_msg_ctx_t *in_msg_ctx = NULL;
axis2_msg_ctx_t **msg_ctx_map = NULL;
AXIS2_PARAM_CHECK(env->error, svr_conn, AXIS2_FALSE);
AXIS2_PARAM_CHECK(env->error, simple_request, AXIS2_FALSE);
conf_ctx = http_worker->conf_ctx;
if(!conf_ctx)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NULL_CONFIGURATION_CONTEXT, AXIS2_FAILURE);
return AXIS2_FALSE;
}
content_length = axis2_http_simple_request_get_content_length(simple_request, env);
request_line = axis2_http_simple_request_get_request_line(simple_request, env);
http_method = axis2_http_request_line_get_method(request_line, env);
http_version = axis2_http_request_line_get_http_version(request_line, env);
if(!http_version)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NULL_HTTP_VERSION, AXIS2_FAILURE);
return AXIS2_FALSE;
}
AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Client HTTP version %s", http_version);
encoding_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING);
if(encoding_header)
{
encoding_header_value = axis2_http_header_get_value(encoding_header, env);
}
response = axis2_http_worker_create_simple_response(http_worker, env);
if(!response)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "cannot create http simple response");
return AXIS2_FALSE;
}
/* if length is not given and it is not chunked, then return error to client */
if((content_length < 0) && encoding_header_value
&& (0 != axutil_strcmp(encoding_header_value, AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED)))
{
if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_POST)
|| 0 == axutil_strcasecmp(http_method, AXIS2_HTTP_PUT))
{
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_LENGTH_REQUIRED_CODE_VAL,
AXIS2_HTTP_RESPONSE_LENGTH_REQUIRED_CODE_NAME);
status = axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
axis2_http_simple_response_free(response, env);
return status;
}
}
request_body = axis2_http_simple_request_get_body(simple_request, env);
out_desc = axis2_conf_get_transport_out(axis2_conf_ctx_get_conf(conf_ctx, env), env,
AXIS2_TRANSPORT_ENUM_HTTP);
in_desc = axis2_conf_get_transport_in(axis2_conf_ctx_get_conf(conf_ctx, env), env,
AXIS2_TRANSPORT_ENUM_HTTP);
msg_ctx = axis2_msg_ctx_create(env, conf_ctx, in_desc, out_desc);
axis2_msg_ctx_set_server_side(msg_ctx, env, AXIS2_TRUE);
cookie_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_COOKIE);
if(cookie_header)
{
char *session_str = NULL;
axis2_char_t *session_id = NULL;
cookie_header_value = axis2_http_header_get_value(cookie_header, env);
if(cookie_header_value)
{
session_id = axis2_http_transport_utils_get_session_id_from_cookie(env,
cookie_header_value);
}
if(session_id && env->get_session_fn)
{
session_str = env->get_session_fn((void *) conf_ctx, session_id);
}
if(session_str)
{
axis2_http_transport_utils_set_session(env, msg_ctx, session_str);
}
}
/*connection_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_CONNECTION);
if(connection_header)
{
axutil_property_t *connection_header_property = NULL;
axis2_char_t *connection_header_value = NULL;
connection_header_value = axis2_http_header_get_value(connection_header, env);
connection_header_property = axutil_property_create_with_args(env,
AXIS2_SCOPE_REQUEST, 0, 0, connection_header_value);
axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_HTTP_HEADER_CONNECTION,
connection_header_property);
}*/
/* Server and Peer IP's */
svr_ip = axis2_simple_http_svr_conn_get_svr_ip(svr_conn, env);
peer_ip = axis2_simple_http_svr_conn_get_peer_ip(svr_conn, env);
if(peer_ip)
{
peer_property = axutil_property_create(env);
axutil_property_set_value(peer_property, env, axutil_strdup(env, peer_ip));
axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_SVR_PEER_IP_ADDR, peer_property);
}
path = axis2_http_request_line_get_uri(request_line, env);
request_url = axutil_url_create(env, AXIS2_HTTP_PROTOCOL, svr_ip, http_worker->svr_port, path);
if(request_url)
{
url_external_form = axutil_url_to_external_form(request_url, env);
}
if(!url_external_form)
{
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL, AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_NAME);
status = axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
axis2_http_simple_response_free(response, env);
response = NULL;
return status;
}
accept_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_ACCEPT);
if(accept_header)
{
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, AXIS2_COMMA);
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, env,
AXIS2_HTTP_HEADER_ACCEPT_CHARSET);
if(accept_charset_header)
{
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,
AXIS2_COMMA);
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);
}
}
accept_language_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_ACCEPT_LANGUAGE);
if(accept_language_header)
{
accept_language_header_value = axis2_http_header_get_value(accept_language_header, env);
}
if(accept_language_header_value)
{
axutil_array_list_t *accept_language_header_field_list = NULL;
axutil_array_list_t *accept_language_record_list = NULL;
accept_language_header_field_list = axutil_tokenize(env, accept_language_header_value,
AXIS2_COMMA);
if(accept_language_header_field_list && axutil_array_list_size(
accept_language_header_field_list, env) > 0)
{
axis2_char_t *token = NULL;
accept_language_record_list = axutil_array_list_create(env, axutil_array_list_size(
accept_language_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_language_record_list, env, rec);
}
AXIS2_FREE(env->allocator, token);
}
token = (axis2_char_t *)axutil_array_list_remove(accept_language_header_field_list,
env, 0);
}
while(token);
}
if(accept_language_record_list && axutil_array_list_size(accept_language_record_list, env)
> 0)
{
axis2_msg_ctx_set_http_accept_language_record_list(msg_ctx, env,
accept_language_record_list);
}
}
/* Here out_stream is set into the in message context. out_stream is copied from in message context
* into the out message context later in core_utils_create_out_msg_ctx() function. The buffer in
* out_stream is finally filled with the soap envelope in http_transport_sender_invoke() function.
* To avoid double freeing of out_stream we reset the out message context at the end of engine
* receive function.
*/
axis2_msg_ctx_set_transport_out_stream(msg_ctx, env, out_stream);
headers = axis2_http_worker_get_headers(http_worker, env, simple_request);
axis2_msg_ctx_set_transport_headers(msg_ctx, env, headers);
svc_grp_uuid = axutil_uuid_gen(env);
if(svc_grp_uuid)
{
axutil_string_t *svc_grp_uuid_str = axutil_string_create_assume_ownership(env,
&svc_grp_uuid);
axis2_msg_ctx_set_svc_grp_ctx_id(msg_ctx, env, svc_grp_uuid_str);
axutil_string_free(svc_grp_uuid_str, env);
}
http_out_transport_info = axis2_http_out_transport_info_create(env, response);
axis2_msg_ctx_set_out_transport_info(msg_ctx, env, &(http_out_transport_info->out_transport));
if(axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_SOAP_ACTION))
{
soap_action = axis2_http_header_get_value(axis2_http_simple_request_get_first_header(
simple_request, env, AXIS2_HTTP_HEADER_SOAP_ACTION), env);
soap_action_str = axutil_string_create(env, soap_action);
}
if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_GET))
{
is_get = AXIS2_TRUE;
}
else if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_HEAD))
{
is_head = AXIS2_TRUE;
}
else if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_DELETE))
{
is_delete = AXIS2_TRUE;
}
else if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_PUT))
{
is_put = AXIS2_TRUE;
}
request_uri = axis2_http_request_line_get_uri(request_line, env);
request_params = axis2_http_transport_utils_get_request_params(env, request_uri);
url_ext_form = axutil_url_to_external_form(request_url, env);
content_type = axis2_http_simple_request_get_content_type(simple_request, env);
if(is_get || is_head || is_delete)
{
if(is_get)
{
/* HTTP GET */
processed = axis2_http_transport_utils_process_http_get_request(env, msg_ctx,
request_body, out_stream, content_type, soap_action_str, url_ext_form, conf_ctx,
request_params);
}
else if(is_delete)
{
/* HTTP DELETE */
processed = axis2_http_transport_utils_process_http_delete_request(env, msg_ctx,
request_body, out_stream, content_type, soap_action_str, url_ext_form, conf_ctx,
request_params);
}
else if(is_head)
{
/* HTTP HEAD */
processed = axis2_http_transport_utils_process_http_head_request(env, msg_ctx,
request_body, out_stream, content_type, soap_action_str, url_ext_form, conf_ctx,
request_params);
}
if(AXIS2_FALSE == processed)
{
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
axis2_char_t *wsdl = NULL;
axis2_bool_t is_services_path = AXIS2_FALSE;
if(!is_delete)
{
axis2_char_t *temp = NULL;
/* check whether request url have "/services" */
temp = strstr(axutil_url_get_path(request_url, env), AXIS2_REQUEST_URL_PREFIX);
if(temp)
{
temp += strlen(AXIS2_REQUEST_URL_PREFIX);
if(*temp == AXIS2_F_SLASH)
{
temp++;
}
if(!*temp || *temp == AXIS2_Q_MARK || *temp == AXIS2_H_MARK)
{
is_services_path = AXIS2_TRUE;
}
}
}
/* processing request for WSDL via "?wsdl" */
wsdl = strstr(url_external_form, AXIS2_REQUEST_WSDL);
if(is_services_path)
{
/* request for service */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_OK_CODE_VAL, AXIS2_HTTP_RESPONSE_OK_CODE_NAME);
body_string = axis2_http_transport_utils_get_services_html(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(!is_delete && wsdl)
{
/* Request is not for delete and ask for wsdl */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_OK_CODE_VAL, AXIS2_HTTP_RESPONSE_OK_CODE_NAME);
body_string = axis2_http_transport_utils_get_services_static_wsdl(env, conf_ctx,
url_external_form);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_APPLICATION_XML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(env->error->error_number == AXIS2_ERROR_SVC_OR_OP_NOT_FOUND)
{
/* Processing SVC or Operation Not found case */
axutil_array_list_t *method_list = NULL;
int size = 0;
method_list = axis2_msg_ctx_get_supported_rest_http_methods(msg_ctx, env);
size = axutil_array_list_size(method_list, env);
if(method_list && size)
{
axis2_http_header_t *allow_header = NULL;
axis2_char_t *method_list_str = NULL;
axis2_char_t *temp;
int i = 0;
method_list_str = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * 29);
if(!method_list_str)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FALSE);
}
temp = method_list_str;
for(i = 0; i < size; i++)
{
if(i)
{
sprintf(temp, AXIS2_COMMA_SPACE_STR);
temp += 2;
}
sprintf(temp, "%s", (axis2_char_t *)axutil_array_list_get(method_list, env,
i));
temp += strlen(temp);
}
*temp = AXIS2_ESC_NULL;
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_METHOD_NOT_ALLOWED_CODE_VAL,
AXIS2_HTTP_RESPONSE_METHOD_NOT_ALLOWED_CODE_NAME);
body_string = axis2_http_transport_utils_get_method_not_allowed(env, conf_ctx);
allow_header = axis2_http_header_create(env, AXIS2_HTTP_HEADER_ALLOW,
method_list_str);
axis2_http_simple_response_set_header(response, env, allow_header);
AXIS2_FREE(env->allocator, method_list_str);
}
else
{
/* 404 Not Found */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_NOT_FOUND_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_FOUND_CODE_NAME);
body_string = axis2_http_transport_utils_get_not_found(env, conf_ctx);
}
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL)
{
/* 400 Bad Request */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL,
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_NAME);
body_string = axis2_http_transport_utils_get_bad_request(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL)
{
/* 408 , Request Time Out */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL,
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_NAME);
body_string = axis2_http_transport_utils_get_request_timeout(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL)
{
/* 409, Conflict */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL, AXIS2_HTTP_RESPONSE_CONFLICT_CODE_NAME);
body_string = axis2_http_transport_utils_get_conflict(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_GONE_CODE_VAL)
{
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_GONE_CODE_VAL, AXIS2_HTTP_RESPONSE_GONE_CODE_NAME);
body_string = axis2_http_transport_utils_get_gone(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL)
{
/* 412 Precondition failed */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL,
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_NAME);
body_string = axis2_http_transport_utils_get_precondition_failed(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL)
{
/* 413 entity too large */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL,
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_NAME);
body_string
= axis2_http_transport_utils_get_request_entity_too_large(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL)
{
/* 503, Service Unavailable*/
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL,
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_NAME);
body_string = axis2_http_transport_utils_get_service_unavailable(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else
{
/* 500 Internal Server Error */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR_CODE_VAL,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR_CODE_NAME);
body_string = axis2_http_transport_utils_get_internal_server_error(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
if(body_string)
{
axis2_char_t str_len[10];
if(!is_head)
{
axis2_http_simple_response_set_body_string(response, env, body_string);
}
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_LENGTH, str_len);
axis2_http_simple_response_set_header(response, env, cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn, simple_request,
response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
}
}
else if(0 == axutil_strcasecmp(http_method, AXIS2_HTTP_POST) || is_put)
{
if(is_put)
{
axutil_property_t *property = NULL;
if(http_worker->is_application_client_side)
{
property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_TRUE, 0,
AXIS2_VALUE_TRUE);
}
else
{
property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_FALSE,
0, AXIS2_VALUE_FALSE);
}
axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_TRANPORT_IS_APPLICATION_CLIENT_SIDE,
property);
status = axis2_http_transport_utils_process_http_put_request(env, msg_ctx,
request_body, out_stream, content_type, content_length, soap_action_str,
url_ext_form);
}
else
{
axutil_property_t *property = NULL;
if(http_worker->is_application_client_side)
{
property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_TRUE, 0,
AXIS2_VALUE_TRUE);
}
else
{
property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_FALSE,
0, AXIS2_VALUE_FALSE);
}
axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_TRANPORT_IS_APPLICATION_CLIENT_SIDE,
property);
status = axis2_http_transport_utils_process_http_post_request(env, msg_ctx,
request_body, out_stream, content_type, content_length, soap_action_str,
url_ext_form);
}
if(AXIS2_FAILURE == status && (is_put || axis2_msg_ctx_get_doing_rest(msg_ctx, env)))
{
/* Failure Occur while processing REST */
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
if(env->error->error_number == AXIS2_ERROR_SVC_OR_OP_NOT_FOUND)
{
axutil_array_list_t *method_list = NULL;
int size = 0;
method_list = axis2_msg_ctx_get_supported_rest_http_methods(msg_ctx, env);
size = axutil_array_list_size(method_list, env);
if(method_list && size)
{
axis2_http_header_t *allow_header = NULL;
axis2_char_t *method_list_str = NULL;
axis2_char_t *temp;
int i = 0;
method_list_str = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * 29);
if(!method_list_str)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FALSE);
}
temp = method_list_str;
for(i = 0; i < size; i++)
{
if(i)
{
sprintf(temp, AXIS2_COMMA_SPACE_STR);
temp += 2;
}
sprintf(temp, "%s", (axis2_char_t *)axutil_array_list_get(method_list, env,
i));
temp += strlen(temp);
}
*temp = AXIS2_ESC_NULL;
/* 405 Method Not Allowed */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_METHOD_NOT_ALLOWED_CODE_VAL,
AXIS2_HTTP_RESPONSE_METHOD_NOT_ALLOWED_CODE_NAME);
body_string = axis2_http_transport_utils_get_method_not_allowed(env, conf_ctx);
allow_header = axis2_http_header_create(env, AXIS2_HTTP_HEADER_ALLOW,
method_list_str);
axis2_http_simple_response_set_header(response, env, allow_header);
AXIS2_FREE(env->allocator, method_list_str);
}
else
{
/* 404 Not Found */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_NOT_FOUND_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_FOUND_CODE_NAME);
body_string = axis2_http_transport_utils_get_not_found(env, conf_ctx);
}
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL)
{
/* 400, Bad Request */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL,
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_NAME);
body_string = axis2_http_transport_utils_get_bad_request(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL)
{
/* 408, Request Timeout */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL,
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_NAME);
body_string = axis2_http_transport_utils_get_request_timeout(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL)
{
/* 409, Conflict Types */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL, AXIS2_HTTP_RESPONSE_CONFLICT_CODE_NAME);
body_string = axis2_http_transport_utils_get_conflict(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_GONE_CODE_VAL)
{
/* 410, Gone. Resource no longer available */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_GONE_CODE_VAL, AXIS2_HTTP_RESPONSE_GONE_CODE_NAME);
body_string = axis2_http_transport_utils_get_gone(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL)
{
/*410, Precondition for the url failed */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL,
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_NAME);
body_string = axis2_http_transport_utils_get_precondition_failed(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL)
{
/* 413, Request entity too large */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL,
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_NAME);
body_string
= axis2_http_transport_utils_get_request_entity_too_large(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else if(axis2_msg_ctx_get_status_code(msg_ctx, env)
== AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL)
{
/* 513, Service Unavailable */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL,
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_NAME);
body_string = axis2_http_transport_utils_get_service_unavailable(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
else
{
/* 500, Internal Server Error */
axis2_http_simple_response_set_status_line(response, env, http_version,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR_CODE_VAL,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR_CODE_NAME);
body_string = axis2_http_transport_utils_get_internal_server_error(env, conf_ctx);
cont_type = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
}
if(body_string)
{
axis2_char_t str_len[10];
if(!is_head)
{
axis2_http_simple_response_set_body_string(response, env, body_string);
}
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len = axis2_http_header_create(env, AXIS2_HTTP_HEADER_CONTENT_LENGTH, str_len);
axis2_http_simple_response_set_header(response, env, cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn, simple_request,
response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
}
else if(status == AXIS2_FAILURE)
{
axis2_msg_ctx_t *fault_ctx = NULL;
axis2_engine_t *engine = axis2_engine_create(env, conf_ctx);
axis2_http_request_line_t *req_line = NULL;
axis2_http_status_line_t *tmp_stat_line = NULL;
axis2_char_t status_line_str[100];
axutil_property_t *http_error_property = NULL;
axis2_char_t *http_error_value = NULL;
axis2_char_t *fault_code = NULL;
int status_code = 0;
axis2_char_t *reason_phrase = NULL;
int stream_len = 0;
if(!engine)
{
return AXIS2_FALSE;
}
http_error_property = axis2_msg_ctx_get_property(msg_ctx, env,
AXIS2_HTTP_TRANSPORT_ERROR);
if(http_error_property)
http_error_value = (axis2_char_t *)axutil_property_get_value(http_error_property,
env);
if(axis2_msg_ctx_get_is_soap_11(msg_ctx, env))
{
fault_code = AXIOM_SOAP_DEFAULT_NAMESPACE_PREFIX AXIS2_COLON_STR
AXIOM_SOAP11_FAULT_CODE_SENDER;
}
else
{
fault_code = AXIOM_SOAP_DEFAULT_NAMESPACE_PREFIX AXIS2_COLON_STR
AXIOM_SOAP12_SOAP_FAULT_VALUE_SENDER;
}
fault_ctx = axis2_engine_create_fault_msg_ctx(engine, env, msg_ctx,
fault_code,
axutil_error_get_message
(env->error));
req_line =
axis2_http_simple_request_get_request_line(simple_request, env);
if (req_line)
{
if (!http_error_value)
{
sprintf(status_line_str, "%s %s\r\n",
http_version,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
}
else
{
sprintf(status_line_str, "%s %s",
http_version,
http_error_value);
}
}
else
{
sprintf(status_line_str, "%s %s\r\n",
AXIS2_HTTP_HEADER_PROTOCOL_11,
AXIS2_HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
}
tmp_stat_line = axis2_http_status_line_create(env, status_line_str);
if (!http_error_value)
{
axis2_engine_send_fault(engine, env, fault_ctx);
}
status_code = axis2_http_status_line_get_status_code(tmp_stat_line, env);
reason_phrase = axis2_http_status_line_get_reason_phrase(tmp_stat_line, env);
axis2_http_simple_response_set_status_line(response, env,
http_version,
status_code,
reason_phrase);
axis2_http_simple_response_set_body_stream(response, env,
out_stream);
stream_len = axutil_stream_get_len (out_stream, env);
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response,
stream_len);
status = axis2_simple_http_svr_conn_write_response(svr_conn, env,
response);
request_handled = AXIS2_TRUE;
if(tmp_stat_line)
{
axis2_http_status_line_free(tmp_stat_line, env);
tmp_stat_line = NULL;
}
axis2_engine_free(engine, env);
if(fault_ctx)
{
axis2_msg_ctx_free(fault_ctx, env);
}
}
}
else
{
/* Other case than, PUT, DELETE, HEAD, GET and POST */
/* 501, Request method is not implemented */
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
axis2_http_simple_response_set_status_line(
response, env,
http_version,
AXIS2_HTTP_RESPONSE_NOT_IMPLEMENTED_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_IMPLEMENTED_CODE_NAME);
body_string =
axis2_http_transport_utils_get_not_implemented(env,
conf_ctx);
cont_type = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
if (body_string)
{
axis2_char_t str_len[10];
axis2_http_simple_response_set_body_string(response, env,
body_string);
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH,
str_len);
axis2_http_simple_response_set_header(response, env, cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
}
if(url_ext_form)
{
AXIS2_FREE(env->allocator, url_ext_form);
}
op_ctx = axis2_msg_ctx_get_op_ctx(msg_ctx, env);
if (op_ctx)
{
/*axis2_msg_ctx_t *out_msg_ctx = NULL;
axis2_msg_ctx_t **msg_ctx_map = NULL;*/
axis2_char_t *language_str = NULL;
msg_ctx_map = axis2_op_ctx_get_msg_ctx_map(op_ctx, env);
out_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_OUT];
if (out_msg_ctx)
{
language_str = axis2_msg_ctx_get_content_language(out_msg_ctx, env);
}
if (language_str && *language_str && !request_handled)
{
axis2_http_header_t *language = NULL;
language = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LANGUAGE,
language_str);
axis2_http_simple_response_set_header(response, env, language);
}
}
if (!request_handled)
{
axis2_bool_t do_rest = AXIS2_FALSE;
axis2_bool_t response_written = AXIS2_FALSE;
if (is_get || is_head || is_put || is_delete ||
axis2_msg_ctx_get_doing_rest(msg_ctx, env))
{
do_rest = AXIS2_TRUE;
}
if ((accept_header_value || accept_charset_header_value ||
accept_language_header_value) && do_rest)
{
axis2_char_t *content_type_header_value = NULL;
axis2_http_header_t *content_type_header = NULL;
axis2_char_t *temp = NULL;
axis2_char_t *language_header_value = NULL;
axis2_http_header_t *language_header = NULL;
content_type_header = axis2_http_simple_response_get_first_header(
response,
env,
AXIS2_HTTP_HEADER_CONTENT_TYPE);
language_header = axis2_http_simple_response_get_first_header(
response,
env,
AXIS2_HTTP_HEADER_CONTENT_LANGUAGE);
if (content_type_header)
{
content_type_header_value = axis2_http_header_get_value(content_type_header,
env);
}
if (content_type_header_value)
{
temp = axutil_strdup(env, content_type_header_value);
}
if (language_header)
{
language_header_value = axis2_http_header_get_value(language_header,
env);
}
if (temp)
{
axis2_char_t *content_type = NULL;
axis2_char_t *char_set = NULL;
axis2_char_t *temp2 = NULL;
temp2 = strchr(temp, AXIS2_SEMI_COLON);
if (temp2)
{
*temp2 = AXIS2_ESC_NULL;
temp2++;
char_set = axutil_strcasestr(temp2, AXIS2_HTTP_CHAR_SET_ENCODING);
}
if (char_set)
{
char_set = axutil_strltrim(env, char_set, AXIS2_SPACE_TAB_EQ);
}
content_type = axutil_strtrim(env, temp, NULL);
if (temp)
{
AXIS2_FREE(env->allocator, temp);
temp = NULL;
}
if (content_type && accept_header_value &&
!axutil_strcasestr(accept_header_value, content_type))
{
temp2 = strchr(content_type, AXIS2_F_SLASH);
if (temp2)
{
*temp2 = AXIS2_ESC_NULL;
temp = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) *
((int)strlen(content_type) + 3));
if (!temp)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return AXIS2_FALSE;
}
sprintf(temp, "%s/*", content_type);
if (!axutil_strcasestr(accept_header_value, temp) &&
!strstr(accept_header_value, AXIS2_HTTP_HEADER_ACCEPT_ALL))
{
/* 406, Not Acceptable */
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_NAME);
body_string =
axis2_http_transport_utils_get_not_acceptable(env,
conf_ctx);
cont_type =
axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
if (body_string)
{
axis2_char_t str_len[10];
axis2_http_simple_response_set_body_string(response, env,
body_string);
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len =
axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH,
str_len);
axis2_http_simple_response_set_header(response,
env,
cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
response_written = AXIS2_TRUE;
}
AXIS2_FREE(env->allocator, temp);
}
}
if (content_type)
{
AXIS2_FREE(env->allocator, content_type);
}
if (char_set)
{
temp2 = strchr(char_set, AXIS2_EQ);
}
if (temp2)
{
++temp2;
}
if (char_set && accept_charset_header_value &&
!axutil_strcasestr(accept_charset_header_value, char_set) &&
!axutil_strcasestr(accept_charset_header_value, temp2))
{
/* 406, Not Acceptable */
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_NAME);
body_string =
axis2_http_transport_utils_get_not_acceptable(env,
conf_ctx);
cont_type =
axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
if (body_string)
{
axis2_char_t str_len[10];
axis2_http_simple_response_set_body_string(response, env,
body_string);
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH,
str_len);
axis2_http_simple_response_set_header(response, env, cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
response_written = AXIS2_TRUE;
}
if (char_set)
{
AXIS2_FREE(env->allocator, char_set);
}
}
if (language_header_value)
{
if (accept_language_header_value &&
!axutil_strcasestr(accept_language_header_value,
language_header_value))
{
/* 406, Not acceptable */
axis2_http_header_t *cont_len = NULL;
axis2_http_header_t *cont_type = NULL;
axis2_char_t *body_string = NULL;
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_VAL,
AXIS2_HTTP_RESPONSE_NOT_ACCEPTABLE_CODE_NAME);
body_string =
axis2_http_transport_utils_get_not_acceptable(env,
conf_ctx);
cont_type =
axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_TYPE,
AXIS2_HTTP_HEADER_ACCEPT_TEXT_HTML);
axis2_http_simple_response_set_header(response, env, cont_type);
axis2_http_simple_response_remove_headers(
response,
env,
AXIS2_HTTP_HEADER_CONTENT_LANGUAGE);
if (body_string)
{
axis2_char_t str_len[10];
axis2_http_simple_response_set_body_string(response, env,
body_string);
sprintf(str_len, "%d", axutil_strlen(body_string));
cont_len = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH,
str_len);
axis2_http_simple_response_set_header(response, env, cont_len);
}
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response, 0);
axis2_simple_http_svr_conn_write_response(svr_conn, env, response);
request_handled = AXIS2_TRUE;
status = AXIS2_TRUE;
response_written = AXIS2_TRUE;
}
}
}
if (!response_written)
{
/* If in there is a soap message is to to be sent in the back channel then we go inside this
* block. Somewhere in the receiveing end axis2_op_ctx_set_response_written() function has
* been called by this time to indicate to append the message into the http back channel.
*/
if (op_ctx && axis2_op_ctx_get_response_written(op_ctx, env))
{
if (do_rest)
{
/*axis2_msg_ctx_t *out_msg_ctx = NULL;
axis2_msg_ctx_t *in_msg_ctx = NULL;
axis2_msg_ctx_t **msg_ctx_map = NULL;*/
/*msg_ctx_map = axis2_op_ctx_get_msg_ctx_map(op_ctx, env);
out_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_OUT];*/
in_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_IN];
if (in_msg_ctx)
{
/* TODO: Add neccessary handling */
}
if (out_msg_ctx)
{
int size = 0;
axutil_array_list_t *output_header_list = NULL;
output_header_list =
axis2_msg_ctx_get_http_output_headers(out_msg_ctx,
env);
if (output_header_list)
{
size = axutil_array_list_size(output_header_list,
env);
}
while (size)
{
axis2_http_header_t *simple_header = NULL;
size--;
simple_header = (axis2_http_header_t *)
axutil_array_list_get(output_header_list,
env, size);
axis2_http_simple_response_set_header(response,
env,
simple_header);
}
if (axis2_msg_ctx_get_status_code(out_msg_ctx, env))
{
int status_code = 0;
axis2_char_t *status_code_str = NULL;
status_code = axis2_msg_ctx_get_status_code(out_msg_ctx, env);
switch (status_code)
{
case AXIS2_HTTP_RESPONSE_CONTINUE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_CONTINUE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_ACK_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_ACK_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_MULTIPLE_CHOICES_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_MULTIPLE_CHOICES_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_MOVED_PERMANENTLY_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_MOVED_PERMANENTLY_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_SEE_OTHER_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_SEE_OTHER_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_TEMPORARY_REDIRECT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_TEMPORARY_REDIRECT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_CONFLICT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_GONE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_GONE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_NAME;
break;
default:
status_code = AXIS2_HTTP_RESPONSE_OK_CODE_VAL;
status_code_str =
AXIS2_HTTP_RESPONSE_OK_CODE_NAME;
break;
}
axis2_http_simple_response_set_status_line(response, env,
http_version,
status_code,
status_code_str);
request_handled = AXIS2_TRUE;
}
}
}
if (!request_handled)
{
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_OK_CODE_VAL,
AXIS2_HTTP_RESPONSE_OK_CODE_NAME);
if (!is_head)
{
/* This is where we append the message into the http back channel.*/
axis2_http_simple_response_set_body_stream(response, env, out_stream);
}
}
}
else if (op_ctx)
{
/* If response is not written */
if (do_rest)
{
/*axis2_msg_ctx_t *out_msg_ctx = NULL;
axis2_msg_ctx_t *in_msg_ctx = NULL;
axis2_msg_ctx_t **msg_ctx_map = NULL;*/
msg_ctx_map = axis2_op_ctx_get_msg_ctx_map(op_ctx, env);
out_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_OUT];
in_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_IN];
if (in_msg_ctx)
{
/* TODO: Add neccssary handling */
}
if (out_msg_ctx)
{
int size = 0;
axutil_array_list_t *output_header_list = NULL;
output_header_list =
axis2_msg_ctx_get_http_output_headers(out_msg_ctx,
env);
if (output_header_list)
{
size = axutil_array_list_size(output_header_list,
env);
}
while (size)
{
axis2_http_header_t *simeple_header = NULL;
size--;
simeple_header = (axis2_http_header_t *)
axutil_array_list_get(output_header_list,
env, size);
axis2_http_simple_response_set_header(response, env,
simeple_header);
}
if (axis2_msg_ctx_get_no_content(out_msg_ctx, env))
{
if (axis2_msg_ctx_get_status_code(out_msg_ctx, env))
{
int status_code = axis2_msg_ctx_get_status_code(out_msg_ctx, env);
axis2_char_t *status_code_str = NULL;
switch (status_code)
{
case AXIS2_HTTP_RESPONSE_RESET_CONTENT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_RESET_CONTENT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_NAME;
break;
default:
status_code =
AXIS2_HTTP_RESPONSE_NO_CONTENT_CODE_VAL;
status_code_str =
AXIS2_HTTP_RESPONSE_NO_CONTENT_CODE_NAME;
break;
}
axis2_http_simple_response_set_status_line(
response, env, http_version,
status_code,
status_code_str);
}
else
{
/* status code not available in msg_ctx */
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_NO_CONTENT_CODE_VAL,
AXIS2_HTTP_RESPONSE_NO_CONTENT_CODE_NAME);
}
request_handled = AXIS2_TRUE;
}
else if (axis2_msg_ctx_get_status_code(out_msg_ctx, env))
{
int status_code = axis2_msg_ctx_get_status_code(out_msg_ctx, env);
axis2_char_t *status_code_str = NULL;
switch (status_code)
{
case AXIS2_HTTP_RESPONSE_CONTINUE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_CONTINUE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_OK_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_OK_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_MULTIPLE_CHOICES_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_MULTIPLE_CHOICES_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_MOVED_PERMANENTLY_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_MOVED_PERMANENTLY_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_SEE_OTHER_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_SEE_OTHER_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_NOT_MODIFIED_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_TEMPORARY_REDIRECT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_TEMPORARY_REDIRECT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_BAD_REQUEST_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_REQUEST_TIMEOUT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_CONFLICT_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_CONFLICT_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_GONE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_GONE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_PRECONDITION_FAILED_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_REQUEST_ENTITY_TOO_LARGE_CODE_NAME;
break;
case AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_VAL:
status_code_str =
AXIS2_HTTP_RESPONSE_SERVICE_UNAVAILABLE_CODE_NAME;
break;
default:
status_code = AXIS2_HTTP_RESPONSE_ACK_CODE_VAL;
status_code_str =
AXIS2_HTTP_RESPONSE_ACK_CODE_NAME;
break;
}
axis2_http_simple_response_set_status_line(
response, env, http_version,
status_code,
status_code_str);
request_handled = AXIS2_TRUE;
}
}
}
if (!request_handled)
{
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_ACK_CODE_VAL,
AXIS2_HTTP_RESPONSE_ACK_CODE_NAME);
}
}
else
{
axis2_http_simple_response_set_status_line(
response, env, http_version,
AXIS2_HTTP_RESPONSE_ACK_CODE_VAL,
AXIS2_HTTP_RESPONSE_ACK_CODE_NAME);
}
if (!response_written)
{
int stream_len = 0;
stream_len = axutil_stream_get_len(out_stream, env);
/*axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response,
stream_len);*/
/* This is where it actually write to the wire in the http back channel
* append case. */
if(out_msg_ctx)
{
axutil_array_list_t *mime_parts = NULL;
mime_parts = axis2_msg_ctx_get_mime_parts(out_msg_ctx, env);
/* If mime_parts is there then that means we send MTOM. So
* in order to send MTOM we are enabling HTTP1.1 and cunk transfer
* encoding */
if(mime_parts)
{
axis2_http_header_t *transfer_enc_header = NULL;
axutil_param_t *callback_name_param = NULL;
axis2_char_t *mtom_sending_callback_name = NULL;
/* Getting the sender callback name paramter if it is
* specified in the configuration file */
callback_name_param = axis2_msg_ctx_get_parameter(out_msg_ctx, env ,
AXIS2_MTOM_SENDING_CALLBACK);
if(callback_name_param)
{
mtom_sending_callback_name =
(axis2_char_t *) axutil_param_get_value (callback_name_param, env);
if(mtom_sending_callback_name)
{
axis2_http_simple_response_set_mtom_sending_callback_name(
response, env, mtom_sending_callback_name);
}
}
axis2_http_simple_response_set_mime_parts(response, env, mime_parts);
axis2_http_simple_response_set_http_version(response, env,
AXIS2_HTTP_HEADER_PROTOCOL_11);
transfer_enc_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED);
axis2_http_simple_response_set_header(response, env,
transfer_enc_header);
/* In the chunking case content-length is zero */
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response,
0);
}
else
{
axis2_http_worker_set_response_headers(http_worker, env, svr_conn,
simple_request, response,
stream_len);
}
}
status = axis2_simple_http_svr_conn_write_response(svr_conn,
env,
response);
}
}
}
if (url_external_form)
{
AXIS2_FREE(env->allocator, url_external_form);
url_external_form = NULL;
}
if (op_ctx)
{
axis2_msg_ctx_t *out_msg_ctx = NULL;
axis2_msg_ctx_t *in_msg_ctx = NULL;
axis2_msg_ctx_t **msg_ctx_map = NULL;
axis2_char_t *msg_id = NULL;
axis2_conf_ctx_t *conf_ctx = NULL;
msg_ctx_map = axis2_op_ctx_get_msg_ctx_map(op_ctx, env);
out_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_OUT];
in_msg_ctx = msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_IN];
if (out_msg_ctx)
{
axis2_msg_ctx_free(out_msg_ctx, env);
out_msg_ctx = NULL;
msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_OUT] = NULL;
}
if (in_msg_ctx)
{
msg_id = axutil_strdup(env, axis2_msg_ctx_get_msg_id(in_msg_ctx, env));
conf_ctx = axis2_msg_ctx_get_conf_ctx(in_msg_ctx, env);
axis2_msg_ctx_free(in_msg_ctx, env);
in_msg_ctx = NULL;
msg_ctx_map[AXIS2_WSDL_MESSAGE_LABEL_IN] = NULL;
}
if (!axis2_op_ctx_is_in_use(op_ctx, env))
{
axis2_op_ctx_destroy_mutex(op_ctx, env);
if (conf_ctx && msg_id)
{
axis2_conf_ctx_register_op_ctx(conf_ctx, env, msg_id, NULL);
AXIS2_FREE(env->allocator, msg_id);
}
axis2_op_ctx_free(op_ctx, env);
}
} /* Done freeing message contexts */
else
{
/* cases like HEAD, WSDL */
axis2_msg_ctx_free(msg_ctx, env);
}
msg_ctx = NULL;
axutil_url_free(request_url, env);
axutil_string_free(soap_action_str, env);
request_url = NULL;
return status;
}
static axis2_status_t
axis2_http_worker_set_response_headers(
axis2_http_worker_t * http_worker,
const axutil_env_t * env,
axis2_simple_http_svr_conn_t * svr_conn,
axis2_http_simple_request_t * simple_request,
axis2_http_simple_response_t * simple_response,
axis2_ssize_t content_length)
{
axis2_http_header_t *conn_header = NULL;
AXIS2_PARAM_CHECK(env->error, svr_conn, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, simple_request, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, simple_response, AXIS2_FAILURE);
if(AXIS2_FALSE == axis2_http_simple_response_contains_header(simple_response, env,
AXIS2_HTTP_HEADER_CONNECTION))
{
conn_header = axis2_http_simple_request_get_first_header(simple_request, env,
AXIS2_HTTP_HEADER_CONNECTION);
if(conn_header)
{
axis2_char_t *value = NULL;
value = axis2_http_header_get_value(conn_header, env);
if(0 == axutil_strcasecmp(value, AXIS2_HTTP_HEADER_CONNECTION_KEEPALIVE))
{
/* Comment these until keep alive support is completed for simple Axis2/C server */
/*axis2_http_header_t *header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONNECTION, AXIS2_HTTP_HEADER_CONNECTION_KEEPALIVE);
axis2_http_simple_response_set_header(simple_response, env, header);
axis2_simple_http_svr_conn_set_keep_alive(svr_conn, env, AXIS2_TRUE);*/
}
if(0 == axutil_strcasecmp(value, AXIS2_HTTP_HEADER_CONNECTION_CLOSE))
{
axis2_http_header_t *header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONNECTION, AXIS2_HTTP_HEADER_CONNECTION_CLOSE);
axis2_http_simple_response_set_header(simple_response, env, header);
axis2_simple_http_svr_conn_set_keep_alive(svr_conn, env, AXIS2_FALSE);
}
}
else
{ /* Connection Header not available */
axis2_char_t *http_version = NULL;
http_version = axis2_http_simple_response_get_http_version(simple_response, env);
if(http_version && !axutil_strcasecmp(http_version, AXIS2_HTTP_HEADER_PROTOCOL_11))
{
/* Comment these until keep alive support is completed for simple Axis2/C server */
/*axis2_simple_http_svr_conn_set_keep_alive(svr_conn, env, AXIS2_TRUE);*/
/* Instead add following to always send close connection header to indicate that
* we don't support http keep alive yet in simple Axis2/C server
*/
axis2_http_header_t *header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONNECTION, AXIS2_HTTP_HEADER_CONNECTION_CLOSE);
axis2_http_simple_response_set_header(simple_response, env, header);
/*axis2_simple_http_svr_conn_set_keep_alive(svr_conn, env, AXIS2_FALSE);*/
}
else
{
axis2_simple_http_svr_conn_set_keep_alive(svr_conn, env, AXIS2_FALSE);
}
}
if(!axis2_http_simple_response_contains_header(simple_response, env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING))
{
if(AXIS2_FALSE == axis2_http_simple_request_contains_header(simple_request, env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING))
{
if(0 != content_length)
{
axis2_char_t content_len_str[10];
axis2_http_header_t *content_len_hdr = NULL;
//Adds more 2 to http content length to involve CR and LF chars
content_length += 2;
sprintf(content_len_str, "%d", content_length);
content_len_hdr = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_CONTENT_LENGTH, content_len_str);
axis2_http_simple_response_set_header(simple_response, env, content_len_hdr);
}
}
else
{
/* Having Transfer encoding Header */
axis2_http_header_t *transfer_enc_header = axis2_http_header_create(env,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING,
AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED);
axis2_http_simple_response_set_header(simple_response, env, transfer_enc_header);
}
}
}
return AXIS2_SUCCESS;
}
static axutil_hash_t *
axis2_http_worker_get_headers(
axis2_http_worker_t * http_worker,
const axutil_env_t * env,
axis2_http_simple_request_t * request)
{
axutil_array_list_t *header_list = NULL;
int hdr_count = 0;
int i = 0;
axutil_hash_t *header_map = NULL;
AXIS2_PARAM_CHECK(env->error, request, NULL);
header_list = axis2_http_simple_request_get_headers(request, env);
if(!header_list)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "http simple request"
"doesn't contain a header list");
return NULL;
}
hdr_count = axutil_array_list_size(header_list, env);
if(0 == hdr_count)
{
AXIS2_LOG_WARNING(env->log, AXIS2_LOG_SI, "http simple request , "
"header list contains zero headers");
return NULL;
}
for(i = 0; i < hdr_count; i++)
{
axis2_http_header_t *tmp_hdr = NULL;
tmp_hdr = axutil_array_list_get(header_list, env, i);
if(!tmp_hdr)
{
continue;
}
if(!header_map)
{
header_map = axutil_hash_make(env);
if(!header_map)
{
return NULL;
}
}
axutil_hash_set(header_map, axis2_http_header_get_name(tmp_hdr, env),
AXIS2_HASH_KEY_STRING, tmp_hdr);
}
return header_map;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_http_worker_set_svr_port(
axis2_http_worker_t * worker,
const axutil_env_t * env,
int port)
{
worker->svr_port = port;
return AXIS2_SUCCESS;
}
#if 0
static axis2_char_t *
axis2_http_worker_get_server_time(
axis2_http_worker_t * http_worker,
const axutil_env_t * env)
{
time_t tp;
char *time_str;
tp = time(&tp);
time_str = ctime(&tp);
if(!time_str)
{
return NULL;
}
if(AXIS2_NEW_LINE == time_str[strlen(time_str) - 1])
{
time_str[strlen(time_str) - 1] = AXIS2_ESC_NULL;
}
/* We use the ANSI C Date Format, which is Legal according to RFC2616,
* Section 3.3.1. We are not a HTTP/1.1 only server, and thus, it suffices.
*/
return time_str;
}
#endif
static axis2_http_simple_response_t *
axis2_http_worker_create_simple_response(
axis2_http_worker_t *http_worker,
const axutil_env_t *env)
{
axis2_http_simple_response_t *response = NULL;
response = axis2_http_simple_response_create_default(env);
if(response)
{
axis2_http_header_t *server = NULL;
axis2_http_header_t *server_date = NULL;
axis2_char_t *date_str = NULL;
char *date_str_tmp = NULL;
time_t tp;
size_t date_str_len = 0;
/* create "Date: xxxx GMT" HTTP header */
tp = time(&tp);
date_str_tmp = ctime(&tp);
if(!date_str_tmp)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "cannot get server time");
return NULL;
}
date_str_len = strlen(date_str_tmp);
if(AXIS2_NEW_LINE == date_str_tmp[date_str_len - 1])
{
date_str_len -= 1;
date_str_tmp[date_str_len] = AXIS2_ESC_NULL;
}
/* We use the ANSI C Date Format, which is Legal according to RFC2616,
* Section 3.3.1. We are not a HTTP/1.1 only server, and thus, it suffices.
*/
date_str = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (date_str_len + 5));
if(!date_str)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
sprintf(date_str, "%s GMT", date_str_tmp);
server_date = axis2_http_header_create(env, AXIS2_HTTP_HEADER_DATE, date_str);
AXIS2_FREE(env->allocator, date_str);
axis2_http_simple_response_set_header(response, env, server_date);
/* create "Server: Axis2C/x.x.x (Simple Axis2 HTTP Server)" HTTP Header */
server = axis2_http_header_create(env, AXIS2_HTTP_HEADER_SERVER,
AXIS2_HTTP_HEADER_SERVER_AXIS2C AXIS2_HTTP_SERVER);
axis2_http_simple_response_set_header(response, env, server);
}
return response;
}
AXIS2_EXTERN void AXIS2_CALL
axis2_http_worker_set_is_application_client_side(
axis2_http_worker_t *http_worker,
const axutil_env_t *env,
axis2_bool_t application_client_side)
{
http_worker->is_application_client_side = application_client_side;
}