/*
 * Licensedo 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.
 */

#ifndef AXIS2_HTTP_TRANSPORT_UTILS_H
#define AXIS2_HTTP_TRANSPORT_UTILS_H

#define AXIS2_MTOM_OUTPUT_BUFFER_SIZE 1024

/**
 * @ingroup axis2_core_transport_http
 * @{
 */

/**
  * @file axis2_http_transport_utils.h
  * @brief axis2 HTTP Transport Utility functions
  * This file includes functions that handles soap and rest request
  * that comes to the engine via HTTP protocol.
  */

#include <axis2_const.h>
#include <axis2_defines.h>
#include <axutil_env.h>
#include <axiom_stax_builder.h>
#include <axis2_msg_ctx.h>
#include <axis2_conf_ctx.h>
#include <axutil_hash.h>
#include <axiom_element.h>
#include <axutil_stream.h>
#include <axiom_soap_envelope.h>
#include <axutil_http_chunked_stream.h>
#include <axis2_http_out_transport_info.h>
#include <axutil_url.h>
#include <axiom_mtom_sending_callback.h>

#ifdef __cplusplus
extern "C"
{
#endif
	
	typedef enum axis2_http_method_types
	{
		AXIS2_HTTP_METHOD_GET = 0,
		AXIS2_HTTP_METHOD_POST,
		AXIS2_HTTP_METHOD_HEAD,
		AXIS2_HTTP_METHOD_PUT,
		AXIS2_HTTP_METHOD_DELETE
	}axis2_http_method_types_t;

	
	typedef struct axis2_http_transport_in
	{
		/** HTTP Content type */
		axis2_char_t *content_type;
		/** HTTP Content length */
		int content_length;
		/** Input message context */
		axis2_msg_ctx_t *msg_ctx;
		
		/** soap action */
		axis2_char_t *soap_action;
		
		/** complete request uri */
		axis2_char_t *request_uri;
		
		/** Input stream */
		axutil_stream_t *in_stream;
		
		/** remote request ip  corresponds to CGI header REMOTE_ADDR */
		axis2_char_t *remote_ip;
		
		/** server port */
		axis2_char_t *svr_port;
		
		/** HTTP transfer encoding header value */
		axis2_char_t *transfer_encoding;
		
		/** HTTP Accept header */
		axis2_char_t *accept_header;
		
		/** HTTP Accept language header */
		axis2_char_t *accept_language_header;
		
		/** HTTP accept charset header */
		axis2_char_t *accept_charset_header;
		/** H&TTP METHOD  Should be one of AXIS2_HTTP_METHOD_GET | AXIS2_HTTP_METHOD_POST |"
		AXIS2_HTTP_METHOD_HEAD | AXIS2_HTTP_METHOD_PUT | AXIS2_HTTP_METHOD_DELETE" */
		int request_method;
		/** out transport */
		axis2_http_out_transport_info_t *out_transport_info;
		/** this is for serving services html */
		axis2_char_t *request_url_prefix;

	}axis2_http_transport_in_t;

	typedef struct axis2_http_transport_out
	{
		/** HTTP Status code string */
		axis2_char_t *http_status_code_name;
		/** HTTP Status code value */
		int http_status_code;
		/** Out message context */
		axis2_msg_ctx_t *msg_ctx;
		/** Response data */
		void *response_data;
		/** HTTP content type */
		axis2_char_t *content_type;
		/** Response data length */
		int response_data_length;
		/** content language */
		axis2_char_t *content_language;
		/** output headers list */
		axutil_array_list_t *output_headers;
		
	}axis2_http_transport_out_t;

    /**
     * size of the key stored in the session file
     */
    #define AXIS2_TRANSPORT_SESSION_KEY_SIZE 64 
    /**
     * size of the value stored in the session file
     */
    #define AXIS2_TRANSPORT_SESSION_VALUE_SIZE 256
    typedef struct axis2_session_file_record
    {
        axis2_char_t key[AXIS2_TRANSPORT_SESSION_KEY_SIZE];
        axis2_char_t value[AXIS2_TRANSPORT_SESSION_VALUE_SIZE];
    } axis2_session_file_record_t;

    /**
     * This will retrieve the session table, set by a service or a module and store it in a session 
     * file named with the unique session id, generated here in. Then it return the Set-Cookie http 
     * header with value containing session id and session expire time.
     * @param env, environments
     * @param msg_ctx
     * @return cookie_header
     */
    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_session(
            const axutil_env_t *env, 
            axis2_msg_ctx_t *msg_ctx);

    /**
     * When the transport receive a Cookie header it calls this function. This will retrieve the
     * stored session info from the file related to the id value of the cookie. It also check 
     * whether the session has timeout by comparing the session expire time contained in the cookie
     * value with the expire time contained in the file. If session expired then it return nothing. 
     * If session is still valid it put the values in a hash table and set it into message context.
     * @param env, environments
     * @param id
     * @param msg_ctx
     */
    AXIS2_EXTERN void AXIS2_CALL
    axis2_http_transport_utils_set_session(
            const axutil_env_t *env, 
            axis2_msg_ctx_t *msg_ctx,
            axis2_char_t *session_str);

    /**
     * After receiving Set-Cookie header in client side store it
     * @param env, environments
     * @param msg_ctx  
     * @param cookie 
     */
    AXIS2_EXTERN void AXIS2_CALL
    axis2_http_transport_utils_store_cookie(
            const axutil_env_t *env, 
            axis2_msg_ctx_t *msg_ctx, 
            axis2_char_t *cookie);

    /** 
     * Read from cookie store before sending from client side
     * @param env, environments 
     * @param msg_ctx
     * @return cookie string
     */
    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_read_from_cookie_store(
            const axutil_env_t *env, 
            axis2_msg_ctx_t *msg_ctx);

	/** 
	 * Initialize the axis2_http_tranport_in_t. Before using this structure users should 
	 * initialize it using this method.
	 * @param in a pointer to a axis2_http_tranport_in_t 
	 * @param env, environments 
	 */
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_http_transport_utils_transport_in_init(axis2_http_transport_in_t *in, 
												const axutil_env_t *env);

	/** 
	 * Uninitialize the axis2_http_tranport_in_t. Before using this structure users should 
	 * initialize it using this method.
	 * @param in a pointer to a axis2_http_tranport_in_t 
	 * @param env, environments 
	 */
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_http_transport_utils_transport_in_uninit(axis2_http_transport_in_t *request, 
												   const axutil_env_t *env);

	/** 
	 * Initialize the axis2_http_tranport_out_t. Before using this structure users should 
	 * initialize it using this method.
	 * @param out a pointer to a axis2_http_tranport_out_t 
	 * @param env, environments 
	 */
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_http_transport_utils_transport_out_init(axis2_http_transport_out_t *out, 
												const axutil_env_t *env);


	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_http_transport_utils_transport_out_uninit(axis2_http_transport_out_t *response, 
												const axutil_env_t *env);
	/**
	* This methods provides the HTTP request handling functionality using axis2 for server side 
	* HTTP modules.
	* @param env, environments 
	* @param conf_ctx, Instance of axis2_conf_ctx_t
	* @param request, populated instance of axis2_http_transport_in_t struct
	* @param response, an instance of axis2_http_transport_out_t struct
	* @returns AXIS2_SUCCESS on success, AXIS2_FAILURE Otherwise
	*/
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_http_transport_utils_process_request(
		const axutil_env_t *env,
		axis2_conf_ctx_t *conf_ctx,
		axis2_http_transport_in_t *request,
		axis2_http_transport_out_t *response);



    /**
    * This function handles the HTTP POST request that comes to the axis2 engine.
	* The request can be either a SOAP request OR a REST request. 
    * @param env, axutil_env_t instance
    * @param msg_ctx, Input message context. (an instance of axis2_msg_ctx_t struct.) 
    * @param in_stream, This is the input message content represented as an axutil_stream instance.
	*  A callback function will be used to read as required from the stream with in the engine.
    * @param out_stream, This is the output stream. The outgoing message contents is represented as
	*                 an instance of axutil_stream
    * @param content_type, HTTP content type. This value should not be null.
    * @param content_length, HTTP Content length value.
    * @param soap_action_header, SOAPAction header value. This is only required in case of SOAP 1.1.
	*         For SOAP 1.2 , the action header will be within the ContentType header and
	*         this method is able to obtain the extract the action header value from content type.
    * @param request_uri, This is the HTTP request uri. Should not be null.
    * @returns AXIS2_SUCCESS on success, AXIS2_FAILURE Otherwise
    */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_http_transport_utils_process_http_post_request(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axutil_stream_t * out_stream,
        const axis2_char_t * content_type,
        const int content_length,
        axutil_string_t * soap_action_header,
        const axis2_char_t * request_uri);


    /**
    * This method handles the HTTP put request. Parameters are similar to that of post_request
	* method.
    * @param env, environment
    * @param msg_ctx, in message context.
    * @param in_stream, input stream
    * @param out_stream, output stream.
    * @param content_type, HTTP ContentType header value
    * @param content_length, HTTP Content length value
    * @param soap_action_header, SOAP Action header value
    * @param request_uri, request uri
    * @returns AXIS2_SUCCESS on success, AXIS2_FAILURE Otherwise
    */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_http_transport_utils_process_http_put_request(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axutil_stream_t * out_stream,
        const axis2_char_t * content_type,
        const int content_length,
        axutil_string_t * soap_action_header,
        const axis2_char_t * request_uri);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_http_transport_utils_process_http_get_request(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axutil_stream_t * out_stream,
        const axis2_char_t * content_type,
        axutil_string_t * soap_action_header,
        const axis2_char_t * request_uri,
        axis2_conf_ctx_t * conf_ctx,
        axutil_hash_t * request_params);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL

    axis2_http_transport_utils_process_http_head_request(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axutil_stream_t * out_stream,
        const axis2_char_t * content_type,
        axutil_string_t * soap_action_header,
        const axis2_char_t * request_uri,
        axis2_conf_ctx_t * conf_ctx,
        axutil_hash_t * request_params);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL

    axis2_http_transport_utils_process_http_delete_request(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axutil_stream_t * out_stream,
        const axis2_char_t * content_type,
        axutil_string_t * soap_action_header,
        const axis2_char_t * request_uri,
        axis2_conf_ctx_t * conf_ctx,
        axutil_hash_t * request_params);

    AXIS2_EXTERN axiom_stax_builder_t *AXIS2_CALL

    axis2_http_transport_utils_select_builder_for_mime(
        const axutil_env_t * env,
        axis2_char_t * request_uri,
        axis2_msg_ctx_t * msg_ctx,
        axutil_stream_t * in_stream,
        axis2_char_t * content_type);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL

    axis2_http_transport_utils_do_write_mtom(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx);

    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL

    axis2_http_transport_utils_get_request_params(
        const axutil_env_t * env,
        axis2_char_t * request_uri);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_not_found(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_not_implemented(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_method_not_allowed(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_not_acceptable(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_bad_request(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_request_timeout(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_conflict(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_gone(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_precondition_failed(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_request_entity_too_large(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_service_unavailable(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_internal_server_error(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL

    axis2_http_transport_utils_get_services_html(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL

    axis2_http_transport_utils_get_services_static_wsdl(
        const axutil_env_t * env,
        axis2_conf_ctx_t * conf_ctx,
        axis2_char_t * request_url);

    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL

    axis2_http_transport_utils_get_request_params(
        const axutil_env_t * env,
        axis2_char_t * request_uri);

    AXIS2_EXTERN axiom_soap_envelope_t *AXIS2_CALL

    axis2_http_transport_utils_create_soap_msg(
        const axutil_env_t * env,
        axis2_msg_ctx_t * msg_ctx,
        const axis2_char_t * soap_ns_uri);

	AXIS2_EXTERN axutil_array_list_t* AXIS2_CALL
	axis2_http_transport_utils_process_accept_headers(
		const axutil_env_t *env,
		axis2_char_t *accept_value);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_http_transport_utils_send_mtom_message(
        axutil_http_chunked_stream_t * chunked_stream,
        const axutil_env_t * env,
        axutil_array_list_t *mime_parts,
        axis2_char_t *sending_callback_name);

    AXIS2_EXTERN void AXIS2_CALL 
    axis2_http_transport_utils_destroy_mime_parts(
        axutil_array_list_t *mime_parts,
        const axutil_env_t *env);

    AXIS2_EXTERN void *AXIS2_CALL 
        axis2_http_transport_utils_initiate_callback(
        const axutil_env_t *env,
        axis2_char_t *callback_name,
        void *user_param,
        axiom_mtom_sending_callback_t **callback);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL axis2_http_transport_utils_is_callback_required(
        const axutil_env_t *env,
        axutil_array_list_t *mime_parts);

    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
    axis2_http_transport_utils_get_session_id_from_cookie(
        const axutil_env_t *env,
        axis2_char_t *cookie);



    /** @} */
#ifdef __cplusplus
}
#endif

#endif       /* AXIS2_HTTP_TRANSPORT_UTILS_H */
