You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sa...@apache.org on 2006/02/02 14:16:47 UTC

svn commit: r374379 - in /webservices/axis2/trunk/c: include/ modules/core/transport/http/ modules/core/transport/http/receiver/ modules/core/transport/http/sender/ modules/util/

Author: sahan
Date: Thu Feb  2 05:16:22 2006
New Revision: 374379

URL: http://svn.apache.org/viewcvs?rev=374379&view=rev
Log:
Serverside chunking handling enabled

Added:
    webservices/axis2/trunk/c/include/axis2_http_chunked_stream.h
    webservices/axis2/trunk/c/modules/core/transport/http/http_chunked_stream.c
Modified:
    webservices/axis2/trunk/c/include/axis2_error.h
    webservices/axis2/trunk/c/include/axis2_http_simple_response.h
    webservices/axis2/trunk/c/include/axis2_http_svr_thread.h
    webservices/axis2/trunk/c/include/axis2_http_transport_utils.h
    webservices/axis2/trunk/c/include/axis2_simple_http_svr_conn.h
    webservices/axis2/trunk/c/modules/core/transport/http/Makefile.am
    webservices/axis2/trunk/c/modules/core/transport/http/http_transport_utils.c
    webservices/axis2/trunk/c/modules/core/transport/http/http_worker.c
    webservices/axis2/trunk/c/modules/core/transport/http/receiver/http_svr_thread.c
    webservices/axis2/trunk/c/modules/core/transport/http/receiver/simple_http_svr_conn.c
    webservices/axis2/trunk/c/modules/core/transport/http/sender/http_client.c
    webservices/axis2/trunk/c/modules/core/transport/http/sender/http_transport_sender.c
    webservices/axis2/trunk/c/modules/util/error.c
    webservices/axis2/trunk/c/modules/util/network_handler.c

Modified: webservices/axis2/trunk/c/include/axis2_error.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_error.h?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_error.h (original)
+++ webservices/axis2/trunk/c/include/axis2_error.h Thu Feb  2 05:16:22 2006
@@ -468,6 +468,8 @@
         AXIS2_ERROR_SVC_SKEL_INVALID_OPERATION_PARAMETERS_IN_SOAP_REQUEST,
         /* Input stream is NULL in msg_ctx */
         AXIS2_ERROR_NULL_IN_STREAM_IN_MSG_CTX,
+        /* NULL stream in the http chunked stream */
+        AXIS2_ERROR_NULL_STREAM_IN_CHUNKED_STREAM,
 
         /** The following has to be the last error value all the time.
             All other error codes should appear above this.

Added: webservices/axis2/trunk/c/include/axis2_http_chunked_stream.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_http_chunked_stream.h?rev=374379&view=auto
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_http_chunked_stream.h (added)
+++ webservices/axis2/trunk/c/include/axis2_http_chunked_stream.h Thu Feb  2 05:16:22 2006
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#ifndef AXIS2_HTTP_CHUNKED_STREAM_H
+#define AXIS2_HTTP_CHUNKED_STREAM_H
+
+/**
+ * @file axis2_http_chunked_stream.h
+ * @brief axis2 HTTP Chunked Stream
+ */
+
+#include <axis2.h>
+#include <axis2_defines.h>
+#include <axis2_env.h>
+#include <axis2_stream.h>
+
+
+#ifdef __cplusplus
+extern "C" 
+{
+#endif
+/** 
+  * @ingroup axis2_core_transport_http
+  * @{
+  */
+
+typedef struct axis2_http_chunked_stream_ops axis2_http_chunked_stream_ops_t;
+typedef struct axis2_http_chunked_stream axis2_http_chunked_stream_t;
+    
+    
+/** 
+ * @brief HTTP Chunked Stream ops struct
+ * Encapsulator struct for ops of axis2_http_chunked_stream
+ */
+AXIS2_DECLARE_DATA struct axis2_http_chunked_stream_ops
+{
+	int (AXIS2_CALL *read) (axis2_http_chunked_stream_t *chunked_stream,
+						axis2_env_t **env, void *buffer, size_t count);
+	
+	int (AXIS2_CALL *write) (axis2_http_chunked_stream_t *chunked_stream, 
+						axis2_env_t **env, const void *buffer, 
+						size_t count);
+	int (AXIS2_CALL *get_current_chunk_size) 
+                        (axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+	axis2_status_t (AXIS2_CALL *write_last_chunk) 
+						(axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+	axis2_status_t (AXIS2_CALL *free) 
+                        (axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+};
+
+/**
+ * @brief HTTP Chunked Stream struct
+ * Axis2 HTTP Chunked Stream
+ */
+AXIS2_DECLARE_DATA struct axis2_http_chunked_stream
+{
+	axis2_http_chunked_stream_ops_t *ops;
+};
+
+
+axis2_http_chunked_stream_t * AXIS2_CALL 
+axis2_http_chunked_stream_create(axis2_env_t **env, axis2_stream_t* stream);
+/********************* Start of function macros	***************************/
+
+#define AXIS2_HTTP_CHUNKED_STREAM_READ(chunked_stream, env, buffer, count) \
+                        ((chunked_stream)->ops->read(chunked_stream, env, \
+						buffer, count))
+#define AXIS2_HTTP_CHUNKED_STREAM_WRITE(chunked_stream, env, buffer, count) \
+						((chunked_stream)->ops->write(chunked_stream, env, \
+						buffer, count))
+#define AXIS2_HTTP_CHUNKED_GET_CURRENT_CHUNK_SIZE(chunked_stream, env) \
+                        ((chunked_stream)->ops->get_current_chunk_size \
+						(chunked_stream, env))
+#define AXIS2_HTTP_CHUNKED_STREAM_WRITE_LAST_CHUNK(chunked_stream, env) \
+						((chunked_stream)->ops->write_last_chunk(chunked_stream\
+						, env))
+#define AXIS2_HTTP_CHUNKED_STREAM_FREE(chunked_stream, env) \
+                        ((chunked_stream)->ops->free(chunked_stream, env))
+
+/************************* End of function macros *****************************/
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+#endif /* AXIS2_HTTP_CHUNKED_STREAM_H */

Modified: webservices/axis2/trunk/c/include/axis2_http_simple_response.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_http_simple_response.h?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_http_simple_response.h (original)
+++ webservices/axis2/trunk/c/include/axis2_http_simple_response.h Thu Feb  2 05:16:22 2006
@@ -176,40 +176,40 @@
 #define AXIS2_HTTP_SIMPLE_RESPONSE_GET_HEADERS(simple_response, env) \
                     ((simple_response)->ops->get_headers\
                     (simple_response, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_FIRST_HEADER(simple_request, env) \
-                    ((simple_request)->ops->get_first_header\
-                    (simple_request, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_REMOVE_HEADERS(simple_request, env, str)\
-                    ((simple_request)->ops->remove_headers\
-                    (simple_request, env, str))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_FIRST_HEADER(simple_response, env, str) \
+                    ((simple_response)->ops->get_first_header\
+                    (simple_response, env, str))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_REMOVE_HEADERS(simple_response, env, str)\
+                    ((simple_response)->ops->remove_headers\
+                    (simple_response, env, str))
 #define AXIS2_HTTP_SIMPLE_RESPONSE_SET_HEADER(simple_response, env, header) \
                     ((simple_response)->ops->set_header\
                     (simple_response, env, header))
 #define AXIS2_HTTP_SIMPLE_RESPONSE_SET_HEADERS(simple_response, env, headers) \
                     ((simple_response)->ops->set_headers\
                     (simple_response, env, headers))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CHARSET(simple_request, env) \
-                    ((simple_request)->ops->get_charset(simple_request, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(simple_request, env) \
-                    ((simple_request)->ops->get_content_length\
-                    (simple_request, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_TYPE(simple_request, env) \
-                    ((simple_request)->ops->get_content_type\
-                    (simple_request, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STRING(simple_request, env, str)\
-                    ((simple_request)->ops->set_body_string\
-                    (simple_request, env, str))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STREAM(simple_request, env, stream)\
-                    ((simple_request)->ops->set_body_stream\
-                    (simple_request, env, stream))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY(simple_request, env)\
-                    ((simple_request)->ops->get_body\
-                    (simple_request, env))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY_BYTES(simple_request, env, buf)\
-                    ((simple_request)->ops->get_body_bytes\
-                    (simple_request, env, buf))
-#define AXIS2_HTTP_SIMPLE_RESPONSE_FREE(simple_request, env)\
-                    ((simple_request)->ops->free(simple_request, env))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CHARSET(simple_response, env) \
+                    ((simple_response)->ops->get_charset(simple_response, env))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(simple_response, env) \
+                    ((simple_response)->ops->get_content_length\
+                    (simple_response, env))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_TYPE(simple_response, env) \
+                    ((simple_response)->ops->get_content_type\
+                    (simple_response, env))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STRING(simple_response, env, str)\
+                    ((simple_response)->ops->set_body_string\
+                    (simple_response, env, str))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STREAM(simple_response, env, stream)\
+                    ((simple_response)->ops->set_body_stream\
+                    (simple_response, env, stream))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY(simple_response, env)\
+                    ((simple_response)->ops->get_body\
+                    (simple_response, env))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY_BYTES(simple_response, env, buf)\
+                    ((simple_response)->ops->get_body_bytes\
+                    (simple_response, env, buf))
+#define AXIS2_HTTP_SIMPLE_RESPONSE_FREE(simple_response, env)\
+                    ((simple_response)->ops->free(simple_response, env))
 
 /************************** End of function macros ****************************/    
 

Modified: webservices/axis2/trunk/c/include/axis2_http_svr_thread.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_http_svr_thread.h?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_http_svr_thread.h (original)
+++ webservices/axis2/trunk/c/include/axis2_http_svr_thread.h Thu Feb  2 05:16:22 2006
@@ -41,6 +41,7 @@
 typedef struct axis2_http_svr_thread_ops axis2_http_svr_thread_ops_t;
 typedef struct axis2_http_svr_thread axis2_http_svr_thread_t;
 
+extern int axis2_http_socket_read_timeout;
     
 /** 
  * @brief HTTP Server Thread ops struct

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=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_http_transport_utils.h (original)
+++ webservices/axis2/trunk/c/include/axis2_http_transport_utils.h Thu Feb  2 05:16:22 2006
@@ -33,6 +33,7 @@
 #include <axis2_om_element.h>
 #include <axis2_stream.h>
 #include <axis2_soap_envelope.h>
+#include <axis2_http_chunked_stream.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -50,9 +51,10 @@
 struct axis2_callback_info
 {
 	axis2_env_t *env;
-	axis2_stream_t *in_stream;
+	void *in_stream;
 	int content_length;
 	int unread_len;
+	axis2_http_chunked_stream_t *chunked_stream;
 };
 typedef struct axis2_callback_info axis2_callback_info_t;
 

Modified: webservices/axis2/trunk/c/include/axis2_simple_http_svr_conn.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_simple_http_svr_conn.h?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_simple_http_svr_conn.h (original)
+++ webservices/axis2/trunk/c/include/axis2_simple_http_svr_conn.h Thu Feb  2 05:16:22 2006
@@ -37,8 +37,7 @@
     typedef struct axis2_simple_http_svr_conn_ops 
                     axis2_simple_http_svr_conn_ops_t;
     typedef struct axis2_simple_http_svr_conn axis2_simple_http_svr_conn_t;
-  
-	extern int axis2_http_socket_read_timeout;	
+  	
 /**
  * @ingroup axis2_core_transport_http
  * @{
@@ -74,12 +73,6 @@
                         (axis2_simple_http_svr_conn_t *svr_conn, 
                         axis2_env_t **env, 
                         axis2_http_simple_response_t *response);
-        int (AXIS2_CALL *get_snd_timeout) 
-                        (axis2_simple_http_svr_conn_t *svr_conn, 
-                        axis2_env_t **env);
-        int (AXIS2_CALL *get_rcv_timeout) 
-                        (axis2_simple_http_svr_conn_t *svr_conn, 
-                        axis2_env_t **env);
         axis2_status_t (AXIS2_CALL *set_rcv_timeout)
                         (axis2_simple_http_svr_conn_t *svr_conn, 
                         axis2_env_t **env, int timeout);
@@ -123,10 +116,6 @@
                     ((svr_conn)->ops->read_request(svr_conn, env))
 #define AXIS2_SIMPLE_HTTP_SVR_CONN_WRITE_RESPONSE(svr_conn, env, response) \
                     ((svr_conn)->ops->write_response(svr_conn, env, response))
-#define AXIS2_SIMPLE_HTTP_SVR_CONN_GET_SND_TIMEOUT(svr_conn, env)\
-                    ((svr_conn)->ops->get_snd_timeout(svr_conn, env))
-#define AXIS2_SIMPLE_HTTP_SVR_CONN_GET_RCV_TIMEOUT(svr_conn, env) \
-                    ((svr_conn)->ops->get_rcv_timeout(svr_conn, env))
 #define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_SND_TIMEOUT(svr_conn, env, timeout) \
                     ((svr_conn)->ops->set_snd_timeout(svr_conn, env, timeout))
 #define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_RCV_TIMEOUT(svr_conn, env, timeout) \

Modified: webservices/axis2/trunk/c/modules/core/transport/http/Makefile.am
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/Makefile.am?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/Makefile.am (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/Makefile.am Thu Feb  2 05:16:22 2006
@@ -8,7 +8,8 @@
 				                     http_status_line.c\
 				                     http_header.c\
                                      url.c\
-                                     http_out_transport_info.c
+                                     http_out_transport_info.c\
+                                     http_chunked_stream.c
 
 INCLUDES = -I$(top_builddir)/include \
            -I$(top_builddir)/modules/util \

Added: webservices/axis2/trunk/c/modules/core/transport/http/http_chunked_stream.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/http_chunked_stream.c?rev=374379&view=auto
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/http_chunked_stream.c (added)
+++ webservices/axis2/trunk/c/modules/core/transport/http/http_chunked_stream.c Thu Feb  2 05:16:22 2006
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#include <axis2_http_chunked_stream.h>
+#include <axis2_string.h>
+#include <string.h>
+#include <axis2_http_transport.h>
+
+/** 
+ * @brief HTTP Chunked Stream struct impl
+ *	Axis2 HTTP Chunked Stream impl  
+ */
+typedef struct axis2_http_chunked_stream_impl axis2_http_chunked_stream_impl_t;  
+  
+struct axis2_http_chunked_stream_impl
+{
+	axis2_http_chunked_stream_t chunked_stream;
+	axis2_stream_t *stream;
+	int current_chunk_size;
+	int unread_len;
+	axis2_bool_t end_of_chunks;
+	axis2_bool_t chunk_started;
+};
+
+#define AXIS2_INTF_TO_IMPL(chunked_stream) \
+                 ((axis2_http_chunked_stream_impl_t *)(chunked_stream))
+
+/***************************** Function headers *******************************/
+int AXIS2_CALL 
+axis2_http_chunked_stream_read (axis2_http_chunked_stream_t *chunked_stream,
+						axis2_env_t **env, void *buffer, size_t count);
+int AXIS2_CALL 
+axis2_http_chunked_stream_write (axis2_http_chunked_stream_t *chunked_stream, 
+						axis2_env_t **env, const void *buffer, 
+						size_t count);
+int AXIS2_CALL 
+axis2_http_chunked_stream_get_current_chunk_size
+                        (axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+
+axis2_status_t AXIS2_CALL
+axis2_http_chunked_stream_start_chunk(
+						axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+						
+axis2_status_t AXIS2_CALL
+axis2_http_chunked_stream_write_last_chunk(
+						axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);
+
+axis2_status_t AXIS2_CALL 
+axis2_http_chunked_stream_free (axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env);				
+/***************************** End of function headers ************************/
+
+axis2_http_chunked_stream_t * AXIS2_CALL 
+axis2_http_chunked_stream_create(axis2_env_t **env, axis2_stream_t *stream)
+{
+    AXIS2_ENV_CHECK(env, NULL);
+    AXIS2_PARAM_CHECK((*env)->error, stream, NULL);
+        
+    axis2_http_chunked_stream_impl_t *chunked_stream_impl = 
+                        (axis2_http_chunked_stream_impl_t *)AXIS2_MALLOC 
+                        ((*env)->allocator, sizeof(
+                        axis2_http_chunked_stream_impl_t));
+	
+    if(NULL == chunked_stream_impl)
+	{
+		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        return NULL;
+	}
+    chunked_stream_impl->stream = stream;
+    chunked_stream_impl->current_chunk_size = -1;
+	chunked_stream_impl->unread_len = -1;
+	chunked_stream_impl->end_of_chunks = AXIS2_FALSE;
+	chunked_stream_impl->chunk_started = AXIS2_FALSE;
+	
+    chunked_stream_impl->chunked_stream.ops = AXIS2_MALLOC((*env)->allocator,
+        				sizeof(axis2_http_chunked_stream_ops_t));
+    if(NULL == chunked_stream_impl->chunked_stream.ops)
+	{
+		axis2_http_chunked_stream_free((axis2_http_chunked_stream_t*)
+                         chunked_stream_impl, env);
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+        return NULL;
+	}
+    
+    chunked_stream_impl->chunked_stream.ops->read =
+                        axis2_http_chunked_stream_read;
+    chunked_stream_impl->chunked_stream.ops->write =
+                        axis2_http_chunked_stream_write;
+    chunked_stream_impl->chunked_stream.ops->get_current_chunk_size =
+                        axis2_http_chunked_stream_get_current_chunk_size;
+	chunked_stream_impl->chunked_stream.ops->write_last_chunk =
+						axis2_http_chunked_stream_write_last_chunk;
+    chunked_stream_impl->chunked_stream.ops->free =
+                        axis2_http_chunked_stream_free;
+	return &(chunked_stream_impl->chunked_stream);
+}
+
+axis2_status_t AXIS2_CALL
+axis2_http_chunked_stream_free(axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env)
+{
+	AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+    if(NULL != chunked_stream->ops)
+        AXIS2_FREE((*env)->allocator, chunked_stream->ops);
+    
+	AXIS2_FREE((*env)->allocator, AXIS2_INTF_TO_IMPL(chunked_stream));
+	return AXIS2_SUCCESS;
+}
+
+int AXIS2_CALL 
+axis2_http_chunked_stream_read (axis2_http_chunked_stream_t *chunked_stream,
+						axis2_env_t **env, void *buffer, size_t count)
+{
+	int len = -1;
+	int yet_to_read = 0;
+	axis2_http_chunked_stream_impl_t *chunked_stream_impl = AXIS2_INTF_TO_IMPL
+						(chunked_stream);
+    axis2_stream_t *stream = chunked_stream_impl->stream;
+   	AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+	
+	if(NULL == buffer)
+	{
+		return -1;
+	}
+	if(NULL == stream)
+	{
+		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NULL_STREAM_IN_CHUNKED_STREAM
+						, AXIS2_FAILURE);
+		return -1;
+	}
+    if(AXIS2_TRUE == chunked_stream_impl->end_of_chunks)
+	{
+		return 0;
+	}
+	if(AXIS2_FALSE == chunked_stream_impl->chunk_started)
+	{
+		axis2_http_chunked_stream_start_chunk(chunked_stream, env);
+	}
+	yet_to_read = count;
+	while(AXIS2_FALSE == chunked_stream_impl->end_of_chunks && yet_to_read > 0)
+	{
+		if(chunked_stream_impl->unread_len < yet_to_read)
+		{
+			len = AXIS2_STREAM_READ(chunked_stream_impl->stream, env, 
+						buffer + count - yet_to_read, 
+						chunked_stream_impl->unread_len);
+			yet_to_read -= len;
+			chunked_stream_impl->unread_len -= len;
+			if(chunked_stream_impl->unread_len <= 0)
+			{
+				axis2_http_chunked_stream_start_chunk(chunked_stream, env);
+			}
+		}
+		else
+		{
+			len = AXIS2_STREAM_READ(chunked_stream_impl->stream, env, 
+						buffer + count - yet_to_read, 
+						yet_to_read);
+			yet_to_read -= len;	
+			chunked_stream_impl->unread_len -= len;
+		}	
+	}
+    return count - yet_to_read;    
+}
+
+int AXIS2_CALL
+axis2_http_chunked_stream_write (axis2_http_chunked_stream_t *chunked_stream
+						, axis2_env_t **env, const void *buffer, 
+						size_t count)
+{
+	axis2_stream_t *stream = AXIS2_INTF_TO_IMPL(chunked_stream)->stream;
+	int len = -1;
+	axis2_char_t tmp_buf[10];
+    AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+		
+	if(NULL == buffer)
+	{
+		return -1;
+	}
+	if(NULL == stream)
+	{
+		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NULL_STREAM_IN_CHUNKED_STREAM
+						, AXIS2_FAILURE);
+		return -1;
+	}
+	sprintf(tmp_buf, "%x%s", count, AXIS2_HTTP_CRLF);
+	len = AXIS2_STREAM_WRITE(stream, env, tmp_buf, AXIS2_STRLEN(tmp_buf));
+	len = AXIS2_STREAM_WRITE(stream, env, buffer, count);
+	AXIS2_STREAM_WRITE(stream, env, AXIS2_HTTP_CRLF, 2);
+    return len;
+}
+
+
+int AXIS2_CALL 
+axis2_http_chunked_stream_get_current_chunk_size
+                        (axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env)
+{
+    AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+    return AXIS2_INTF_TO_IMPL(chunked_stream)->current_chunk_size;
+}
+
+
+axis2_status_t AXIS2_CALL
+axis2_http_chunked_stream_start_chunk(
+						axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env)
+{
+	axis2_char_t tmp_buf[3] = "";
+	axis2_char_t str_chunk_len[512] = "";
+	axis2_char_t *tmp = NULL;
+	int read = -1;
+	axis2_http_chunked_stream_impl_t *chunked_stream_impl = NULL;
+	AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+	
+	chunked_stream_impl = AXIS2_INTF_TO_IMPL(chunked_stream);
+	/* remove the last CRLF of the previous chunk if any */
+	if(AXIS2_TRUE == chunked_stream_impl->chunk_started)
+	{
+		read = AXIS2_STREAM_READ(chunked_stream_impl->stream, env, tmp_buf, 2);
+		chunked_stream_impl->chunk_started = AXIS2_FALSE;
+	}
+	/* read the len and chunk extension */
+	while((read = AXIS2_STREAM_READ(chunked_stream_impl->stream, env, tmp_buf, 
+						1)) > 0)
+	{
+		tmp_buf[read] = '\0';
+		strcat(str_chunk_len, tmp_buf);
+		if(0 != strstr(str_chunk_len, AXIS2_HTTP_CRLF))
+		{
+			break;
+		}
+	}
+	/* check whether we have extensions */
+	tmp = strchr(str_chunk_len, ';');
+	if(NULL != tmp)
+	{
+		/* we don't use extensions right now */
+		*tmp = '\0';
+	}
+	chunked_stream_impl->current_chunk_size = strtol(str_chunk_len, NULL, 16);
+	if(0 == chunked_stream_impl->current_chunk_size)
+	{
+		chunked_stream_impl->end_of_chunks = AXIS2_TRUE;
+	}
+	else
+	{
+		chunked_stream_impl->chunk_started = AXIS2_TRUE;
+		chunked_stream_impl->unread_len = 
+						chunked_stream_impl->current_chunk_size;
+	}
+	return AXIS2_SUCCESS;
+}
+
+axis2_status_t AXIS2_CALL
+axis2_http_chunked_stream_write_last_chunk(
+						axis2_http_chunked_stream_t *chunked_stream, 
+                        axis2_env_t **env)
+{
+	axis2_stream_t *stream = NULL;
+	AXIS2_FUNC_PARAM_CHECK(chunked_stream, env, AXIS2_FAILURE);
+	
+	stream = AXIS2_INTF_TO_IMPL(chunked_stream)->stream;
+	if(AXIS2_STREAM_WRITE(stream, env, "0\r\n", 3) == 3)
+	{
+		return AXIS2_SUCCESS;
+	}
+	return AXIS2_FAILURE;
+}

Modified: webservices/axis2/trunk/c/modules/core/transport/http/http_transport_utils.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/http_transport_utils.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/http_transport_utils.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/http_transport_utils.c Thu Feb  2 05:16:22 2006
@@ -29,6 +29,7 @@
 #include <axis2_om_node.h>
 #include <axis2_hash.h>
 #include <axis2_soap.h>
+#include <axis2_http_header.h>
 
 /***************************** Function headers *******************************/
 
@@ -114,6 +115,7 @@
 	/*axis2_char_t *xml_char_set = NULL;*/
 	axis2_conf_ctx_t *conf_ctx = NULL;
 	axis2_callback_info_t callback_ctx;
+	axis2_hash_t *headers = NULL;
 	
     AXIS2_PARAM_CHECK((*env)->error, msg_ctx, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, in_stream, AXIS2_FAILURE);
@@ -127,7 +129,7 @@
 	callback_ctx.env = *env;
 	callback_ctx.content_length = content_length;
 	callback_ctx.unread_len = content_length;
-	
+	callback_ctx.chunked_stream = NULL;
 	
 	if(NULL != soap_action_header)	
 	{
@@ -142,6 +144,34 @@
 			soap_action_header[strlen(soap_action_header) -1] = '\0';
 		}
 	}
+	headers = AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env, AXIS2_TRANSPORT_HEADERS, 
+						AXIS2_FALSE);
+	if(NULL != headers)
+	{
+		axis2_http_header_t *encoding_header = NULL;
+		encoding_header = (axis2_http_header_t*)axis2_hash_get(headers, 
+						AXIS2_HTTP_HEADER_TRANSFER_ENCODING,
+						AXIS2_HASH_KEY_STRING);
+		if(NULL != encoding_header)
+		{
+			axis2_char_t *encoding_value = NULL;
+			encoding_value = AXIS2_HTTP_HEADER_GET_VALUE(encoding_header, env);
+			if(NULL != encoding_value && 0 == AXIS2_STRCASECMP(encoding_value, 
+						AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED))
+			{
+				callback_ctx.chunked_stream = axis2_http_chunked_stream_create(
+							env, in_stream);
+				if(NULL == callback_ctx.chunked_stream)
+				{
+					AXIS2_LOG_ERROR((*env)->log, AXIS2_LOG_SI, "Error occured in"
+							" creating in chunked stream.");
+					return AXIS2_FALSE;				
+				}
+				AXIS2_LOG_DEBUG((*env)->log, AXIS2_LOG_SI, "HTTP"
+						" stream chunked");
+			}
+		}
+	}
 	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, 
@@ -726,7 +756,6 @@
 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;
 	int len = -1;
     axis2_callback_info_t *cb_ctx = (axis2_callback_info_t*)ctx;
@@ -735,18 +764,31 @@
 	{
 		return 0;
 	}
+	env = &((axis2_callback_info_t*)ctx)->env;
 	if(cb_ctx->unread_len <= 0 && -1 != cb_ctx->content_length)
 	{
 		return 0;
 	}
-	in_stream = ((axis2_callback_info_t*)ctx)->in_stream;
-	env = &((axis2_callback_info_t*)ctx)->env;
-	len = AXIS2_STREAM_READ(in_stream, env, buffer, size);
-	if(len > 0)
+	if(cb_ctx->chunked_stream != NULL)
 	{
-		((axis2_callback_info_t*)ctx)->unread_len -= len;
+		/*TODO remove this debug message */
+		AXIS2_LOG_DEBUG((*env)->log, AXIS2_LOG_SI, "Stream chunked");
+		len = AXIS2_HTTP_CHUNKED_STREAM_READ(cb_ctx->chunked_stream, env, 
+						buffer, size);
+		return len;
 	}
-	return len;
+	else
+	{
+		axis2_stream_t *in_stream = NULL;
+		in_stream = (axis2_stream_t *)((axis2_callback_info_t*)ctx)->in_stream;
+		len = AXIS2_STREAM_READ(in_stream, env, buffer, size);
+		if(len > 0)
+		{
+			((axis2_callback_info_t*)ctx)->unread_len -= len;
+		}
+		return len;
+	}
+	return 0;	
 }
 
 axis2_soap_envelope_t* AXIS2_CALL
@@ -775,6 +817,7 @@
 	callback_ctx.env = *env;
 	callback_ctx.content_length = -1;
 	callback_ctx.unread_len = -1;
+	callback_ctx.chunked_stream = NULL;
     
     op_ctx = AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env);
     if(NULL != op_ctx)
@@ -826,6 +869,13 @@
         {
             AXIS2_OM_STAX_BUILDER_FREE(om_builder, env);
             om_builder = NULL;
+            xml_reader = NULL;
+            return NULL;
+        }
+		if(NULL == soap_builder)
+        {
+            AXIS2_OM_STAX_BUILDER_FREE(om_builder, env);
+			om_builder = NULL;
             xml_reader = NULL;
             return NULL;
         }

Modified: webservices/axis2/trunk/c/modules/core/transport/http/http_worker.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/http_worker.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/http_worker.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/http_worker.c Thu Feb  2 05:16:22 2006
@@ -25,6 +25,7 @@
 #include <axis2_http_transport_utils.h>
 #include <axis2_op_ctx.h>
 #include <axis2_engine.h>
+#include <axis2_uuid_gen.h>
 
 /** 
  * @brief HTTP Worker struct impl
@@ -139,6 +140,8 @@
 	axis2_char_t *ctx_written = NULL;
 	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_FUNC_PARAM_CHECK(http_worker, env, AXIS2_FAILURE);
     AXIS2_PARAM_CHECK((*env)->error, svr_conn, AXIS2_FAILURE);
@@ -165,8 +168,20 @@
 						AXIS2_FAILURE);
 		return AXIS2_FAILURE;
 	}
+	AXIS2_LOG_DEBUG((*env)->log, AXIS2_LOG_SI, "Client HTTP version %s", 
+						http_version);
+	
 	response = axis2_http_simple_response_create_default(env);
-	if(content_length < 0)
+	encoding_header = AXIS2_HTTP_SIMPLE_REQUEST_GET_FIRST_HEADER(simple_request,
+						env, AXIS2_HTTP_HEADER_TRANSFER_ENCODING);
+	if(NULL != encoding_header)
+	{
+		encoding_header_value = AXIS2_HTTP_HEADER_GET_VALUE(encoding_header, 
+						env);
+	}
+	if(content_length < 0 && (NULL != encoding_header_value && 0 != AXIS2_STRCMP
+						(encoding_header_value, 
+						AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED)))
 	{
 		if(0 == AXIS2_STRCASECMP(AXIS2_HTTP_REQUEST_LINE_GET_METHOD(
 						AXIS2_HTTP_SIMPLE_REQUEST_GET_REQUEST_LINE(
@@ -206,10 +221,7 @@
 	AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, AXIS2_TRANSPORT_HEADERS, 
 						axis2_http_worker_get_headers(http_worker, env, 
 						simple_request), AXIS2_FALSE);
-	/*
-	 * TODO uuidgen
-	 * AXIS2_MSG_CTX_SET_SVC_GRP_CTX_ID(uuid, env);
-	 */
+	AXIS2_MSG_CTX_SET_SVC_GRP_CTX_ID(msg_ctx, env, axis2_uuid_gen(env));
 	AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env, AXIS2_HTTP_OUT_TRANSPORT_INFO,
 						axis2_http_out_transport_info_create(env, response), 
 						AXIS2_FALSE);
@@ -331,13 +343,13 @@
 	{
 		AXIS2_HTTP_SIMPLE_RESPONSE_SET_STAUTUS_LINE(response, env, http_version,
 						AXIS2_HTTP_RESPONSE_OK_CODE_VAL, "OK");
+		AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STREAM(response, env, out_stream);
 	}
 	else
 	{
 		AXIS2_HTTP_SIMPLE_RESPONSE_SET_STAUTUS_LINE(response, env, http_version,
 						AXIS2_HTTP_RESPONSE_ACK_CODE_VAL, "Accepted");
 	}
-	AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STREAM(response, env, out_stream);
 	axis2_http_worker_set_response_headers(http_worker, env, svr_conn, 
 						simple_request, response, AXIS2_STREAM_BASIC_GET_LEN(
 						out_stream, env));
@@ -411,8 +423,8 @@
                     AXIS2_FALSE);
             }
         }
-        if(AXIS2_FALSE == 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)
             {
@@ -426,6 +438,14 @@
                     content_len_hdr);
             }
         }
+		else
+		{
+			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;
 }
@@ -461,6 +481,42 @@
 axis2_http_worker_get_headers(axis2_http_worker_t *http_worker, 
 						axis2_env_t **env, axis2_http_simple_request_t *request)
 {
-	/* TODO implement */
-	return NULL;
+	axis2_array_list_t *header_list = NULL;
+	int hdr_count = 0;
+	int i = 0;
+	axis2_hash_t *header_map = NULL;
+	AXIS2_FUNC_PARAM_CHECK(http_worker, env, AXIS2_FAILURE);
+    AXIS2_PARAM_CHECK((*env)->error, request, AXIS2_FAILURE);
+	
+	header_list = AXIS2_HTTP_SIMPLE_REQUEST_GET_HEADERS(request, env);
+	if(NULL == header_list)
+	{
+		return NULL;
+	}
+	hdr_count = AXIS2_ARRAY_LIST_SIZE(header_list, env);
+	if(0 == hdr_count)
+	{
+		return NULL;
+	}
+	
+	for(i = 0; i < hdr_count; i++)
+	{
+		axis2_http_header_t *tmp_hdr = NULL;
+		tmp_hdr = AXIS2_ARRAY_LIST_GET(header_list, env, i);
+		if(NULL == tmp_hdr)
+		{
+			continue;
+		}
+		if(NULL == header_map)
+		{
+			header_map = axis2_hash_make(env);
+			if(NULL == header_map)
+			{
+				return NULL;
+			}
+		}
+		axis2_hash_set(header_map, AXIS2_HTTP_HEADER_GET_NAME(tmp_hdr, env),
+						AXIS2_HASH_KEY_STRING, tmp_hdr);
+	}
+	return header_map;
 }

Modified: webservices/axis2/trunk/c/modules/core/transport/http/receiver/http_svr_thread.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/receiver/http_svr_thread.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/receiver/http_svr_thread.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/receiver/http_svr_thread.c Thu Feb  2 05:16:22 2006
@@ -171,8 +171,8 @@
 		}
 		AXIS2_PLATFORM_GET_TIME_IN_MILLIS(&t1);
 		svr_conn = axis2_simple_http_svr_conn_create(env, socket);
-		/*AXIS2_SIMPLE_HTTP_SVR_CONN_SET_RCV_TIMEOUT(svr_conn, env, 
-						axis2_http_socket_read_timeout);*/
+		AXIS2_SIMPLE_HTTP_SVR_CONN_SET_RCV_TIMEOUT(svr_conn, env, 
+						axis2_http_socket_read_timeout);
 		request = AXIS2_SIMPLE_HTTP_SVR_CONN_READ_REQUEST(svr_conn, env);
 		tmp = svr_thread_impl->worker;
 		status = AXIS2_HTTP_WORKER_PROCESS_REQUEST(tmp, env, svr_conn, request);
@@ -197,7 +197,6 @@
 		}
 		
 	}
-	
     return AXIS2_SUCCESS;
 }
 
@@ -216,13 +215,13 @@
 		return AXIS2_SUCCESS;
 	}
 	svr_thread_impl->stopped = AXIS2_TRUE;
-	/* TODO log*/
+	AXIS2_LOG_DEBUG((*env)->log, AXIS2_LOG_SI, "Destrying HTTP server thread.");
 	if(svr_thread_impl->listen_socket)
 	{
 		axis2_network_handler_close_socket(env, svr_thread_impl->listen_socket);
 		svr_thread_impl->listen_socket = -1;
 	}
-	/* TODO: stop all the chiled threads */
+	/* TODO: stop all the child threads */
 	return AXIS2_SUCCESS;
 }
 

Modified: webservices/axis2/trunk/c/modules/core/transport/http/receiver/simple_http_svr_conn.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/receiver/simple_http_svr_conn.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/receiver/simple_http_svr_conn.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/receiver/simple_http_svr_conn.c Thu Feb  2 05:16:22 2006
@@ -19,6 +19,7 @@
 #include <axis2_http_transport.h>
 #include <axis2_string.h>
 #include <axis2_network_handler.h>
+#include <axis2_http_chunked_stream.h>
 
 /** 
  * @brief Simple HTTP Server Connection struct impl
@@ -42,38 +43,52 @@
 
 axis2_status_t AXIS2_CALL 
 axis2_simple_http_svr_conn_close(axis2_simple_http_svr_conn_t *svr_conn, 
-                                    axis2_env_t **env);
+						axis2_env_t **env);
 
 axis2_bool_t AXIS2_CALL
 axis2_simple_http_svr_conn_is_open(axis2_simple_http_svr_conn_t *svr_conn, 
-                                    axis2_env_t **env);
+                        axis2_env_t **env);
 
 axis2_status_t AXIS2_CALL 
 axis2_simple_http_svr_conn_set_keep_alive 
-                                    (axis2_simple_http_svr_conn_t *svr_conn, 
-                                    axis2_env_t **env, axis2_bool_t keep_alive);
+                        (axis2_simple_http_svr_conn_t *svr_conn, 
+                        axis2_env_t **env, axis2_bool_t keep_alive);
 
 axis2_bool_t AXIS2_CALL 
 axis2_simple_http_svr_conn_is_keep_alive(axis2_simple_http_svr_conn_t *svr_conn, 
-                                        axis2_env_t **env);
+                        axis2_env_t **env);
                                         
 axis2_stream_t* AXIS2_CALL 
 axis2_simple_http_svr_conn_get_stream(axis2_simple_http_svr_conn_t *svr_conn, 
-                                        axis2_env_t **env);
+                        axis2_env_t **env);
                                         
 axis2_http_response_writer_t* AXIS2_CALL 
 axis2_simple_http_svr_conn_get_writer(axis2_simple_http_svr_conn_t *svr_conn, 
-                                        axis2_env_t **env);
+                        axis2_env_t **env);
                                         
 axis2_http_simple_request_t* AXIS2_CALL 
 axis2_simple_http_svr_conn_read_request(axis2_simple_http_svr_conn_t *svr_conn, 
-                                        axis2_env_t **env);
+                        axis2_env_t **env);
                                         
 axis2_status_t AXIS2_CALL 
 axis2_simple_http_svr_conn_write_response
-                                (axis2_simple_http_svr_conn_t *svr_conn, 
-                                axis2_env_t **env, 
-                                axis2_http_simple_response_t *response);
+                        (axis2_simple_http_svr_conn_t *svr_conn, 
+                        axis2_env_t **env, 
+                        axis2_http_simple_response_t *response);
+						
+axis2_status_t AXIS2_CALL 
+axis2_simple_http_svr_conn_set_rcv_timeout
+		                (axis2_simple_http_svr_conn_t *svr_conn, 
+        		        axis2_env_t **env, int timeout);
+						
+axis2_status_t AXIS2_CALL 
+axis2_simple_http_svr_conn_set_snd_timeout
+                        (axis2_simple_http_svr_conn_t *svr_conn, 
+                        axis2_env_t **env, int timeout);
+int AXIS2_CALL 
+axis2_simple_http_svr_conn_read_request_body
+                        (axis2_simple_http_svr_conn_t *svr_conn, 
+                        axis2_env_t **env, axis2_char_t *buffer, int size);
                                 
 axis2_status_t AXIS2_CALL 
 axis2_simple_http_svr_conn_free(axis2_simple_http_svr_conn_t *svr_conn, 
@@ -99,10 +114,6 @@
     svr_conn_impl->stream = NULL;
     svr_conn_impl->keep_alive = AXIS2_FALSE;
 	
-	/* set the socket timeout to 30 seconds */
-	axis2_network_handler_set_sock_option(env, sockfd, SO_RCVTIMEO, 
-						axis2_http_socket_read_timeout);
-    
 	if(-1 != svr_conn_impl->socket)
 	{
 		svr_conn_impl->stream = axis2_stream_create_socket(env, 
@@ -126,17 +137,21 @@
     svr_conn_impl->svr_conn.ops->close = axis2_simple_http_svr_conn_close;
     svr_conn_impl->svr_conn.ops->is_open = axis2_simple_http_svr_conn_is_open;
     svr_conn_impl->svr_conn.ops->set_keep_alive =
-                                    axis2_simple_http_svr_conn_set_keep_alive;
+                        axis2_simple_http_svr_conn_set_keep_alive;
     svr_conn_impl->svr_conn.ops->is_keep_alive = 
-                                    axis2_simple_http_svr_conn_is_keep_alive;
+                        axis2_simple_http_svr_conn_is_keep_alive;
     svr_conn_impl->svr_conn.ops->get_stream = 
-                                    axis2_simple_http_svr_conn_get_stream;
+                        axis2_simple_http_svr_conn_get_stream;
     svr_conn_impl->svr_conn.ops->get_writer = 
-                                    axis2_simple_http_svr_conn_get_writer;
+                        axis2_simple_http_svr_conn_get_writer;
     svr_conn_impl->svr_conn.ops->read_request = 
-                                    axis2_simple_http_svr_conn_read_request;
+                        axis2_simple_http_svr_conn_read_request;
     svr_conn_impl->svr_conn.ops->write_response =
-                                    axis2_simple_http_svr_conn_write_response;
+                        axis2_simple_http_svr_conn_write_response;
+	svr_conn_impl->svr_conn.ops->set_rcv_timeout = 
+						axis2_simple_http_svr_conn_set_rcv_timeout;
+	svr_conn_impl->svr_conn.ops->set_snd_timeout = 
+						axis2_simple_http_svr_conn_set_snd_timeout;
     svr_conn_impl->svr_conn.ops->free = axis2_simple_http_svr_conn_free;
     return &(svr_conn_impl->svr_conn);
 }
@@ -335,6 +350,10 @@
 	axis2_char_t *response_body = NULL;
 	int body_size = 0;
 	int i = 0;
+	axis2_http_header_t *enc_header = NULL;
+	axis2_bool_t chuked_encoding = AXIS2_FALSE;
+	axis2_char_t *status_line = NULL;
+	
 	
     AXIS2_FUNC_PARAM_CHECK(svr_conn, env, AXIS2_FAILURE);
 	AXIS2_PARAM_CHECK((*env)->error, response, AXIS2_FAILURE);
@@ -346,10 +365,38 @@
 	{
 		return AXIS2_FAILURE;
 	}
-	
-	AXIS2_HTTP_RESPONSE_WRITER_PRINT_STR(response_writer, env, 
-						AXIS2_HTTP_SIMPLE_RESPONSE_GET_STAUTUS_LINE(response, 
-						env));
+	enc_header = AXIS2_HTTP_SIMPLE_RESPONSE_GET_FIRST_HEADER(response, env, 
+						AXIS2_HTTP_HEADER_TRANSFER_ENCODING);
+	if(NULL != enc_header)
+	{
+		axis2_char_t *enc_value = AXIS2_HTTP_HEADER_GET_VALUE(enc_header, env);
+		if(NULL != enc_value)
+		{
+			if(0 == AXIS2_STRCMP(enc_value, 
+						AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED))
+			{
+				chuked_encoding = AXIS2_TRUE;
+				/* remove the content length header */
+				if(AXIS2_TRUE == AXIS2_HTTP_SIMPLE_RESPONSE_CONTAINS_HEADER(
+						response,env, AXIS2_HTTP_HEADER_CONTENT_LENGTH))
+				{
+					AXIS2_HTTP_SIMPLE_RESPONSE_REMOVE_HEADERS(response, env, 
+						AXIS2_HTTP_HEADER_CONTENT_LENGTH);
+				}
+			}
+		}
+	}
+	status_line = AXIS2_HTTP_SIMPLE_RESPONSE_GET_STAUTUS_LINE(response, env);
+	if(NULL == status_line)
+	{
+		AXIS2_ERROR_SET((*env)->error, 
+						AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE, 
+						AXIS2_FAILURE);
+		AXIS2_HTTP_RESPONSE_WRITER_FREE(response_writer, env);
+		response_writer = NULL;
+		return AXIS2_FAILURE;
+	}
+	AXIS2_HTTP_RESPONSE_WRITER_PRINT_STR(response_writer, env, status_line);
 	headers = AXIS2_HTTP_SIMPLE_RESPONSE_GET_HEADERS(response, env);
 	
 	if(NULL != headers)
@@ -366,13 +413,17 @@
 							(axis2_http_header_t*)header, env));
 			}
 	    }
-    	AXIS2_HTTP_RESPONSE_WRITER_PRINTLN(response_writer, env);
     }
+	AXIS2_HTTP_RESPONSE_WRITER_PRINTLN(response_writer, env);
 	
 	response_stream = AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY(response, env);
 	body_size = AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY_BYTES(response, env, 
 						&response_body);
-	if(body_size > 0)
+	if(body_size <= 0)
+	{
+		return AXIS2_SUCCESS;
+	}
+	if(AXIS2_FALSE == chuked_encoding)
 	{
 		axis2_status_t write_stat = AXIS2_FAILURE;
 		write_stat = AXIS2_HTTP_RESPONSE_WRITER_PRINTLN_STR(response_writer, 
@@ -384,8 +435,43 @@
 			return AXIS2_FAILURE;
 		}
 	}
-    /*
-        TODO chunking
-    */
+	else
+	{
+		axis2_http_chunked_stream_t *chunked_stream = NULL;
+		int left = body_size;
+		chunked_stream = axis2_http_chunked_stream_create(env, 
+						svr_conn_impl->stream);
+		while(left > 0)
+		{
+			left -= AXIS2_HTTP_CHUNKED_STREAM_WRITE(chunked_stream, env, 
+						response_body, body_size);
+		}
+		AXIS2_HTTP_CHUNKED_STREAM_WRITE_LAST_CHUNK(chunked_stream, env);
+		AXIS2_HTTP_CHUNKED_STREAM_FREE(chunked_stream, env);
+	}
     return AXIS2_SUCCESS;
+}
+
+axis2_status_t AXIS2_CALL 
+axis2_simple_http_svr_conn_set_rcv_timeout
+		                (axis2_simple_http_svr_conn_t *svr_conn, 
+        		        axis2_env_t **env, int timeout)
+{
+	AXIS2_FUNC_PARAM_CHECK(svr_conn, env, AXIS2_FAILURE);
+	return axis2_network_handler_set_sock_option(env, 
+						AXIS2_INTF_TO_IMPL(svr_conn)->socket, SO_RCVTIMEO, 
+						timeout);
+	
+	
+}
+						
+axis2_status_t AXIS2_CALL 
+axis2_simple_http_svr_conn_set_snd_timeout
+                        (axis2_simple_http_svr_conn_t *svr_conn, 
+                        axis2_env_t **env, int timeout)
+{
+	AXIS2_FUNC_PARAM_CHECK(svr_conn, env, AXIS2_FAILURE);
+	return axis2_network_handler_set_sock_option(env, 
+						AXIS2_INTF_TO_IMPL(svr_conn)->socket, SO_SNDTIMEO, 
+						timeout);
 }

Modified: webservices/axis2/trunk/c/modules/core/transport/http/sender/http_client.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/sender/http_client.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/sender/http_client.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/sender/http_client.c Thu Feb  2 05:16:22 2006
@@ -165,9 +165,10 @@
 	AXIS2_FUNC_PARAM_CHECK(client, env, AXIS2_FAILURE);
     client_impl = AXIS2_INTF_TO_IMPL(client);
 	
-	if(NULL != client_impl->url)
+	if(NULL == client_impl->url)
 	{
 		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NULL_URL, AXIS2_FAILURE);
+		return AXIS2_FAILURE;
 	}
     
 	client_impl->sockfd = axis2_network_handler_open_socket(env, 

Modified: webservices/axis2/trunk/c/modules/core/transport/http/sender/http_transport_sender.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/transport/http/sender/http_transport_sender.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/transport/http/sender/http_transport_sender.c (original)
+++ webservices/axis2/trunk/c/modules/core/transport/http/sender/http_transport_sender.c Thu Feb  2 05:16:22 2006
@@ -161,7 +161,7 @@
 	
 	char_set_enc = AXIS2_MSG_CTX_GET_PROPERTY(msg_ctx, env, 
 							AXIS2_CHARACTER_SET_ENCODING, AXIS2_FALSE);
-	if(NULL != char_set_enc)
+	if(NULL == char_set_enc)
 	{
 		axis2_op_ctx_t *op_ctx = AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env);
 		if(NULL != op_ctx)

Modified: webservices/axis2/trunk/c/modules/util/error.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/util/error.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/util/error.c (original)
+++ webservices/axis2/trunk/c/modules/util/error.c Thu Feb  2 05:16:22 2006
@@ -401,6 +401,8 @@
     "Invalid parameters for service operation in SOAP request";
     axis2_error_messages[AXIS2_ERROR_NULL_IN_STREAM_IN_MSG_CTX] =
     "Input stream is NULL in msg_ctx"; 
+    axis2_error_messages[AXIS2_ERROR_NULL_STREAM_IN_CHUNKED_STREAM] =
+    "NULL stream in the http chunked stream";
     return AXIS2_SUCCESS;
 }
 

Modified: webservices/axis2/trunk/c/modules/util/network_handler.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/util/network_handler.c?rev=374379&r1=374378&r2=374379&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/util/network_handler.c (original)
+++ webservices/axis2/trunk/c/modules/util/network_handler.c Thu Feb  2 05:16:22 2006
@@ -17,11 +17,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
-/*#include <unistd.h>*/
 #include <axis2_network_handler.h>
-/*#include <arpa/inet.h>
-#includ <netinet/in.h>
-#include <netdb.h>*/
 #include <fcntl.h>
 #include <axis2_platform_auto_sense.h>
 
@@ -57,7 +53,8 @@
         lphost = gethostbyname(server); /*nnn netdb.h*/
 
         if (NULL != lphost)
-            sock_addr.sin_addr.s_addr = ((struct in_addr*)lphost->h_addr)->s_addr;
+            sock_addr.sin_addr.s_addr = 
+						((struct in_addr*)lphost->h_addr)->s_addr;
         else
         {
             AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_INVALID_ADDRESS, 
@@ -77,7 +74,7 @@
 	setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &nodelay, 
 						sizeof(nodelay));
 	ll.l_onoff = 1;
-    ll.l_linger = 1;
+    ll.l_linger = 5;
     setsockopt(sock, SOL_SOCKET, SO_LINGER , &ll, sizeof(struct linger));
 	return sock;
 }
@@ -98,7 +95,8 @@
 	}
 	/** Address re-use */
 	i = 1;
-	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR ,(char*) &i, sizeof(axis2_socket_t));/*nnn casted 4th param to char* */
+	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR ,(char*) &i, 
+						sizeof(axis2_socket_t));/*nnn casted 4th param to char* */
 	/** Exec behaviour */
 	AXIS2_CLOSE_SOCKET_ON_EXIT(sock)
 	
@@ -158,7 +156,8 @@
 }
 
 AXIS2_DECLARE(axis2_socket_t)						
-axis2_network_handler_svr_socket_accept(axis2_env_t **env, axis2_socket_t svr_socket)
+axis2_network_handler_svr_socket_accept(axis2_env_t **env, 
+						axis2_socket_t svr_socket)
 {
 	axis2_socket_t cli_socket = AXIS2_INVALID_SOCKET;
 	struct sockaddr cli_addr;
@@ -178,7 +177,7 @@
 	setsockopt(cli_socket, IPPROTO_TCP, TCP_NODELAY, &nodelay, 
 						sizeof(nodelay));
 	ll.l_onoff = 1;
-    ll.l_linger = 1;
+    ll.l_linger = 5;
     setsockopt(cli_socket, SOL_SOCKET, SO_LINGER , &ll, sizeof(struct linger));
     return cli_socket;
 }