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;
}