You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sa...@apache.org on 2006/01/11 08:49:42 UTC

svn commit: r367960 - in /webservices/axis2/trunk/c: include/axis2_http_transport_utils.h modules/core/transport/http/axis2_http_transport_utils.c modules/core/transport/http/axis2_http_worker.c

Author: samisa
Date: Tue Jan 10 23:49:35 2006
New Revision: 367960

URL: http://svn.apache.org/viewcvs?rev=367960&view=rev
Log:
Added functionality which were missing

Modified:
    webservices/axis2/trunk/c/include/axis2_http_transport_utils.h
    webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_transport_utils.c
    webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_worker.c

Modified: webservices/axis2/trunk/c/include/axis2_http_transport_utils.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_http_transport_utils.h?rev=367960&r1=367959&r2=367960&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_http_transport_utils.h (original)
+++ webservices/axis2/trunk/c/include/axis2_http_transport_utils.h Tue Jan 10 23:49:35 2006
@@ -32,6 +32,7 @@
 #include <axis2_hash.h>
 #include <axis2_om_element.h>
 #include <axis2_stream.h>
+#include <axis2_soap_envelope.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -42,6 +43,17 @@
  * @ingroup axis2_core_transport_http
  * @{
  */
+
+/* 
+ * struct to hold the callback information
+ */	
+struct axis2_callback_info
+{
+	axis2_env_t *env;
+	axis2_stream_t *in_stream;
+};
+typedef struct axis2_callback_info axis2_callback_info_t;
+
 axis2_status_t AXIS2_CALL 
 axis2_http_transport_utils_process_http_post_request
                         (axis2_env_t **env, axis2_msg_ctx_t *msg_ctx, 
@@ -53,15 +65,16 @@
 axis2_bool_t AXIS2_CALL 
 axis2_http_transport_utils_process_http_get_request
                         (axis2_env_t **env, axis2_msg_ctx_t *msg_ctx,
-                        axis2_stream_t *stream, axis2_char_t *content_type,
+                        axis2_stream_t *in_stream, axis2_stream_t *out_stream,
+						axis2_char_t *content_type,
                         axis2_char_t *soap_action_header, 
                         axis2_char_t *request_uri, axis2_conf_ctx_t *conf_ctx, 
                         axis2_hash_t *request_params);
     
-/*axis2_soap_envelope_t* AXIS2_CALL 
+axis2_soap_envelope_t* AXIS2_CALL 
 axis2_http_transport_utils_create_envelope_from_get_request
                         (axis2_env_t **env, axis2_char_t *request_uri,
-                        axis2_hash_t *request_params);*/
+                        axis2_hash_t *request_params);
     
 axis2_om_stax_builder_t* AXIS2_CALL 
 axis2_http_transport_utils_select_builder_for_mime

Modified: webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_transport_utils.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_transport_utils.c?rev=367960&r1=367959&r2=367960&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_transport_utils.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_transport_utils.c Tue Jan 10 23:49:35 2006
@@ -21,6 +21,13 @@
 #include <axis2_op.h>
 #include <axis2_qname.h>
 #include <axis2_http_transport.h>
+#include <axis2_soap_model_builder.h>
+#include <axis2_engine.h>
+#include <axis2_soap_body.h>
+#include <axis2_utils.h>
+#include <axis2_om_namespace.h>
+#include <axis2_om_node.h>
+#include <axis2_hash.h>
 
 /***************************** Function headers *******************************/
 
@@ -35,15 +42,16 @@
 axis2_bool_t AXIS2_CALL 
 axis2_http_transport_utils_process_http_get_request
                         (axis2_env_t **env, axis2_msg_ctx_t *msg_ctx,
-                        axis2_stream_t *stream, axis2_char_t *content_type,
+                        axis2_stream_t *in_stream, axis2_stream_t *out_stream,
+						axis2_char_t *content_type,
                         axis2_char_t *soap_action_header, 
                         axis2_char_t *request_uri, axis2_conf_ctx_t *conf_ctx, 
                         axis2_hash_t *request_params);
     
-/*axis2_soap_envelope_t* AXIS2_CALL 
+axis2_soap_envelope_t* AXIS2_CALL 
 axis2_http_transport_utils_create_envelope_from_get_request
                         (axis2_env_t **env, axis2_char_t *request_uri,
-                        axis2_hash_t *request_params);*/
+                        axis2_hash_t *request_params);
     
 axis2_om_stax_builder_t* AXIS2_CALL 
 axis2_http_transport_utils_select_builder_for_mime
@@ -77,7 +85,11 @@
 axis2_char_t* AXIS2_CALL
 axis2_http_transport_utils_get_services_html(axis2_env_t **env, 
 							axis2_conf_ctx_t *conf_ctx);
-                                
+axis2_char_t* AXIS2_CALL
+axis2_http_transport_utils_get_charset_enc(axis2_env_t **env, 
+						axis2_char_t *content_type);
+int
+axis2_http_transport_utils_on_data_request(char *buffer, int size, void *ctx);						
 /***************************** End of function headers ************************/
 
 axis2_status_t AXIS2_CALL 
@@ -88,11 +100,27 @@
                         axis2_char_t *soap_action_header,
                         axis2_char_t *request_uri)
 {
+	axis2_soap_envelope_t *soap_envelope = NULL;
+	axis2_soap_model_builder_t *soap_builder = NULL;
+	axis2_om_stax_builder_t *om_builder = NULL;
+	axis2_bool_t is_soap11 = AXIS2_FALSE;
+	axis2_xml_reader_t *xml_reader = NULL;
+	axis2_char_t *char_set = NULL;
+	axis2_char_t *xml_char_set = NULL;
+	axis2_conf_ctx_t *conf_ctx = NULL;
+	axis2_callback_info_t callback_ctx;
+	
     AXIS2_PARAM_CHECK((*env)->error, msg_ctx, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, in_stream, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, out_stream, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, content_type, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, request_uri, AXIS2_FAILURE);
+	
+	conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
+	
+	callback_ctx.in_stream = in_stream;
+	callback_ctx.env = *env;
+	
 	if(NULL != soap_action_header)	
 	{
 		/* remove leading and trailing " s */
@@ -105,42 +133,218 @@
 		{
 			soap_action_header[strlen(soap_action_header) -1] = '\0';
 		}
-		AXIS2_MSG_CTX_SET_WSA_ACTION(msg_ctx, env, soap_action_header);
-		AXIS2_MSG_CTX_SET_SOAP_ACTION(msg_ctx, env, soap_action_header);
-		AXIS2_MSG_CTX_SET_TO(msg_ctx, env, axis2_endpoint_ref_create(env, 
-						request_uri));
-		AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, 
-						AXIS2_TRANSPORT_OUT, out_stream, AXIS2_FALSE);
-		AXIS2_MSG_CTX_SET_SERVER_SIDE(msg_ctx, env, AXIS2_TRUE);
-		
-		
 	}
-	/*
-        TODO code
-    */
-    return AXIS2_SUCCESS;
+	AXIS2_MSG_CTX_SET_WSA_ACTION(msg_ctx, env, soap_action_header);
+	AXIS2_MSG_CTX_SET_SOAP_ACTION(msg_ctx, env, soap_action_header);
+	AXIS2_MSG_CTX_SET_TO(msg_ctx, env, axis2_endpoint_ref_create(env, 
+					request_uri));
+	AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, 
+					AXIS2_TRANSPORT_OUT, out_stream, AXIS2_FALSE);
+	AXIS2_MSG_CTX_SET_SERVER_SIDE(msg_ctx, env, AXIS2_TRUE);
+	
+	xml_reader = axis2_xml_reader_create_for_memory(env, 
+						axis2_http_transport_utils_on_data_request, 
+						(void *)&callback_ctx, NULL);
+	char_set = axis2_http_transport_utils_get_charset_enc(env,content_type);
+	/* TODO set the charset of the stream before (at least default)
+	 *	we read them
+	 */
+	AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, AXIS2_CHARACTER_SET_ENCODING,
+					char_set, AXIS2_TRUE);
+	om_builder = axis2_om_stax_builder_create(env, xml_reader);
+	if(NULL != strstr(content_type, AXIS2_HTTP_HEADER_ACCEPT_APPL_SOAP))
+	{
+		is_soap11 = AXIS2_FALSE;
+		soap_builder = axis2_soap_model_builder_create(env, om_builder);
+		/* TODO set the soap12 namespace URI */
+		soap_envelope = AXIS2_SOAP_MODEL_BUILDER_GET_SOAP_ENVELOPE(soap_builder,
+					env);
+	}
+	else if(NULL != strstr(content_type, AXIS2_HTTP_HEADER_ACCEPT_TEXT_XML))
+	{
+		is_soap11 = AXIS2_TRUE;
+		if(NULL != soap_action_header && AXIS2_STRLEN(soap_action_header)
+					> 0)
+		{
+			soap_builder = axis2_soap_model_builder_create(env, om_builder);
+			/* TODO set the soap11 namespace URI */
+			soap_envelope = AXIS2_SOAP_MODEL_BUILDER_GET_SOAP_ENVELOPE(
+					soap_builder, env);
+		}
+		/* REST support
+		 * else
+		 * {
+		 *		envelope = AXIS2_SOAP_ENVELOPE_GET_DEFAULT_SOAP_ENVELOPE(
+		 *			env);
+		 *		AXIS2_SOAP_BODY_ADD_CHILD(AXIS2_SOAP_ENVELOPE_GET_BODY(
+		 *			envelope, env), AXIS2_OM_STAX_BUILDER_GET_DOCUMENT(
+		 *			om_builder, env));
+		 */			
+	}
+	/* xml_char_set = AXIS2_OM_DOCUMENT_GET_CHARSET_ENC(
+	 *					AXIS2_OM_STAX_BUILDER_GET_DOCUMENT(env om_builder),
+	 *					env);
+	 *
+	 *if(0 != AXIS2_STRCMP(char_set, xml_char_set))
+	 *{
+	 *	AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_CHARSET_MISMATCH, 
+	 *					AXIS2_FAILURE);
+	 *	AXIS2_SOAP_ENVELOPE_FREE(envelope, env);
+	 *	envelope = NULL;
+	 *	AXIS2_XML_READER_FREE(xml_reader, env);
+	 *	xml_reader = NULL;
+	 *	AXIS2_OM_STAX_BUILDER_FREE(om_builder, env);
+	 *	om_builder = NULL;
+	 *	if(NULL != soap_builder)
+	 *	{
+	 *	 	AXIS2_SOAP_MODEL_BUILDER_FREE(soap_builder, env);
+	 *	 	soap_builder = NULL;
+	 *	}
+	 *	return AXIS2_FAILURE;
+	 *}
+	 */
+	
+	AXIS2_MSG_CTX_SET_SOAP_ENVELOPE(msg_ctx, env, soap_envelope);
+	axis2_engine_t *engine = NULL;
+	engine = axis2_engine_create(env, conf_ctx);
+	if(AXIS2_TRUE == AXIS2_SOAP_BODY_HAS_FAULT(AXIS2_SOAP_ENVELOPE_GET_BODY(
+						soap_envelope, env), env))
+	{
+		AXIS2_ENGINE_RECEIVE_FAULT(engine, env, msg_ctx);
+	}
+	else
+	{
+		AXIS2_ENGINE_RECEIVE(engine, env, msg_ctx);
+	}
+	if(NULL == AXIS2_MSG_CTX_GET_SOAP_ENVELOPE(msg_ctx, env) && 
+						AXIS2_FALSE == is_soap11)
+	{
+		axis2_soap_envelope_t *def_envelope = axis2_soap_envelope_create_null
+						(env);
+		AXIS2_MSG_CTX_SET_SOAP_ENVELOPE(msg_ctx, env, def_envelope);
+	}
+	return AXIS2_SUCCESS;
 }
 
 
 axis2_bool_t AXIS2_CALL 
 axis2_http_transport_utils_process_http_get_request
                         (axis2_env_t **env, axis2_msg_ctx_t *msg_ctx,
-                        axis2_stream_t *stream, axis2_char_t *content_type,
+                        axis2_stream_t *in_stream, axis2_stream_t *out_stream,
+						axis2_char_t *content_type,
                         axis2_char_t *soap_action_header, 
                         axis2_char_t *request_uri, axis2_conf_ctx_t *conf_ctx, 
                         axis2_hash_t *request_params)
 {
+	axis2_soap_envelope_t *soap_envelope = NULL;
+	axis2_engine_t *engine = NULL;
+		
+	AXIS2_PARAM_CHECK((*env)->error, msg_ctx, AXIS2_FALSE);
+	AXIS2_PARAM_CHECK((*env)->error, in_stream, AXIS2_FALSE);
+	AXIS2_PARAM_CHECK((*env)->error, out_stream, AXIS2_FALSE);
+	AXIS2_PARAM_CHECK((*env)->error, content_type, AXIS2_FALSE);
+	AXIS2_PARAM_CHECK((*env)->error, request_uri, AXIS2_FALSE);
+	AXIS2_PARAM_CHECK((*env)->error, request_params, AXIS2_FALSE);
+	
+	if(NULL != soap_action_header)	
+	{
+		/* remove leading and trailing " s */
+		if('"' == soap_action_header[0])
+		{
+			memmove(soap_action_header, soap_action_header+sizeof(axis2_char_t),
+						strlen(soap_action_header) + sizeof(axis2_char_t));
+		}
+		if('"' == soap_action_header[strlen(soap_action_header) -1])
+		{
+			soap_action_header[strlen(soap_action_header) -1] = '\0';
+		}
+	}
+	AXIS2_MSG_CTX_SET_WSA_ACTION(msg_ctx, env, soap_action_header);
+	AXIS2_MSG_CTX_SET_SOAP_ACTION(msg_ctx, env, soap_action_header);
+	AXIS2_MSG_CTX_SET_TO(msg_ctx, env, axis2_endpoint_ref_create(env, 
+					request_uri));
+	AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, 
+					AXIS2_TRANSPORT_OUT, out_stream, AXIS2_FALSE);
+	AXIS2_MSG_CTX_SET_SERVER_SIDE(msg_ctx, env, AXIS2_TRUE);
+	
+	soap_envelope = axis2_http_transport_utils_create_envelope_from_get_request(
+					env, request_uri, request_params);
+	if(NULL == soap_envelope)
+	{
+		return AXIS2_FALSE;
+	}
+	else
+	{
+		AXIS2_MSG_CTX_SET_DOING_REST(msg_ctx, env, AXIS2_TRUE);
+		AXIS2_MSG_CTX_SET_SOAP_ENVELOPE(msg_ctx, env, soap_envelope);
+		engine = axis2_engine_create(env, conf_ctx);
+		AXIS2_ENGINE_RECEIVE(engine, env, msg_ctx);
+		return AXIS2_TRUE;
+	}
     return AXIS2_FALSE;
 }
 
 
-/*axis2_soap_envelope_t* AXIS2_CALL 
+axis2_soap_envelope_t* AXIS2_CALL 
 axis2_http_transport_utils_create_envelope_from_get_request
                         (axis2_env_t **env, axis2_char_t *request_uri,
                         axis2_hash_t *request_params)
 {
-    return NULL;
-}*/
+	axis2_char_t **values = NULL;
+	axis2_soap_envelope_t *envelope = NULL;
+	axis2_om_namespace_t *om_ns = NULL;
+	axis2_om_namespace_t *def_om_ns = NULL;
+	axis2_om_node_t *document_node = NULL;
+	axis2_om_node_t *op_node = NULL;
+	axis2_om_element_t *op_ele = NULL;
+	axis2_hash_index_t *hi = NULL;
+	AXIS2_PARAM_CHECK((*env)->error, request_uri, NULL);
+	AXIS2_PARAM_CHECK((*env)->error, request_params, NULL);
+	
+	values = axis2_parse_request_url_for_svc_and_op(env, request_uri);
+	if(NULL == values)
+	{
+		return NULL;
+	}
+	if(NULL == values[0] && NULL != values[1])
+	{
+		AXIS2_FREE((*env)->allocator, values[1]);
+		AXIS2_FREE((*env)->allocator, values);
+		return NULL;
+	}
+	if(NULL != values[0] && NULL == values[1])
+	{
+		AXIS2_FREE((*env)->allocator, values[0]);
+		AXIS2_FREE((*env)->allocator, values);
+		return NULL;
+	}
+	if(NULL == values[0] && NULL == values[1])
+	{
+		AXIS2_FREE((*env)->allocator, values);
+		return NULL;
+	}
+	envelope = axis2_soap_envelope_create_null(env);
+	om_ns = axis2_om_namespace_create(env, values[0], "services");
+	def_om_ns = axis2_om_namespace_create(env, "", NULL);
+	document_node = AXIS2_SOAP_BODY_GET_BASE_NODE(AXIS2_SOAP_ENVELOPE_GET_BODY(
+						envelope, env), env);
+	op_ele = axis2_om_element_create(env, document_node, values[1], om_ns, 
+						&op_node);
+	
+	for(hi = axis2_hash_first(request_params, env); NULL != hi; 
+						axis2_hash_next(env, hi))
+	{
+		axis2_char_t *name = NULL;
+		axis2_char_t *value = NULL;
+		axis2_om_element_t *tmp_ele = NULL;
+		axis2_om_node_t *tmp_node = NULL;
+		axis2_hash_this(hi, (const void **)&name, NULL, (void**)&value);
+		tmp_ele = axis2_om_element_create(env, op_node, name, def_om_ns, 
+						&tmp_node);
+		AXIS2_OM_ELEMENT_SET_TEXT(tmp_ele, env, value, tmp_node);
+	}
+    return envelope;
+}
 
 
 axis2_om_stax_builder_t* AXIS2_CALL 
@@ -149,6 +353,9 @@
                         axis2_msg_ctx_t *msg_ctx, axis2_stream_t *in_stream,
                         axis2_char_t *content_type)
 {
+	/*
+        TODO implement when MTOM support is added
+    */
     return NULL;
 }
 
@@ -157,6 +364,9 @@
 axis2_http_transport_utils_is_optimized(axis2_env_t **env, 
                                         axis2_om_element_t *om_element)
 {
+	/*
+        TODO implement when MTOM support is added
+    */
     return AXIS2_FALSE;
 }
 
@@ -423,4 +633,18 @@
 		return AXIS2_STRDUP(AXIS2_HTTP_HEADER_DEFAULT_CHAR_ENCODING, env);
 	}
 	return AXIS2_STRDUP(tmp, env);
+}
+
+int
+axis2_http_transport_utils_on_data_request(char *buffer, int size, void *ctx)
+{
+	axis2_stream_t *in_stream = NULL;
+	axis2_env_t **env = NULL;
+	if(NULL == buffer || NULL == ctx)
+	{
+		return 0;
+	}
+	in_stream = ((axis2_callback_info_t*)ctx)->in_stream;
+	env = &((axis2_callback_info_t*)ctx)->env;
+	return AXIS2_STREAM_READ(in_stream, env, buffer, size);
 }

Modified: webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_worker.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_worker.c?rev=367960&r1=367959&r2=367960&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_worker.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/axis2_http_worker.c Tue Jan 10 23:49:35 2006
@@ -200,7 +200,7 @@
 						simple_request, env), env), AXIS2_HTTP_HEADER_GET))
 	{
 		processed = axis2_http_transport_utils_process_http_get_request
-                        (env, msg_ctx, request_body, 
+                        (env, msg_ctx, request_body, out_stream,
 						AXIS2_HTTP_SIMPLE_REQUEST_GET_CONTENT_TYPE(
 						simple_request, env) ,soap_action,
 						AXIS2_HTTP_REQUEST_LINE_GET_URI(