You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2007/07/19 21:28:33 UTC

svn commit: r557749 - in /webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp: receiver/tcp_worker.c sender/tcp_transport_sender.c

Author: dinesh
Date: Thu Jul 19 12:28:30 2007
New Revision: 557749

URL: http://svn.apache.org/viewvc?view=rev&rev=557749
Log:
tcp sender improved, more error handling

Modified:
    webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/receiver/tcp_worker.c
    webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/sender/tcp_transport_sender.c

Modified: webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/receiver/tcp_worker.c
URL: http://svn.apache.org/viewvc/webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/receiver/tcp_worker.c?view=diff&rev=557749&r1=557748&r2=557749
==============================================================================
--- webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/receiver/tcp_worker.c (original)
+++ webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/receiver/tcp_worker.c Thu Jul 19 12:28:30 2007
@@ -118,6 +118,7 @@
     axutil_stream_t *svr_stream = NULL;
     axis2_char_t *buffer = NULL;
     int len = 0;
+    int write = -1;
 
     reader = axiom_xml_reader_create_for_memory(env, simple_request,
         axutil_strlen(simple_request), NULL, AXIS2_XML_PARSER_TYPE_BUFFER);
@@ -181,9 +182,18 @@
     len = out_stream->len;
 
     if (svr_stream && buffer)
-        axutil_stream_write (svr_stream, env, buffer, len + 1);
+    {
+        write = axutil_stream_write (svr_stream, env, buffer, len + 1);
+        if (write < 0)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "stream write failed");
+            return AXIS2_FAILURE;
+        }
+        axutil_stream_close (svr_stream, env);
+        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "stream wrote:%s", buffer);
+    }
 
-    return AXIS2_TRUE;
+    return AXIS2_SUCCESS;
 }
 
 static axis2_status_t 

Modified: webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/sender/tcp_transport_sender.c
URL: http://svn.apache.org/viewvc/webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/sender/tcp_transport_sender.c?view=diff&rev=557749&r1=557748&r2=557749
==============================================================================
--- webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/sender/tcp_transport_sender.c (original)
+++ webservices/axis2/scratch/c/dinesh/602/c/src/core/transport/tcp/sender/tcp_transport_sender.c Thu Jul 19 12:28:30 2007
@@ -26,9 +26,10 @@
 #include <axis2_tcp_transport.h>
 #include <axis2_tcp_sender.h>
 #include <axiom_soap_body.h>
+#include <axiom_soap.h>
 #include <axutil_types.h>
 
-
+#define RES_BUFF 50
 /**
  * TCP Transport Sender struct impl
  * Axis2 TCP Transport Sender impl
@@ -159,43 +160,186 @@
 
     is_server = axis2_msg_ctx_get_server_side (msg_ctx, env);
 
-    if (is_server)
-    {
-        soap_envelope = axis2_msg_ctx_get_soap_envelope(msg_ctx, env);
+    soap_envelope = axis2_msg_ctx_get_soap_envelope(msg_ctx, env);
     
-        xml_writer = axiom_xml_writer_create_for_memory(env, NULL,
+    xml_writer = axiom_xml_writer_create_for_memory(env, NULL,
                                                     AXIS2_TRUE, 0, 
                                                     AXIS2_XML_PARSER_TYPE_BUFFER);
-        if (!xml_writer)
+    if (!xml_writer)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                        "[tcp]Failed to create XML writer");
+        return AXIS2_FAILURE;
+    }
+    
+    om_output = axiom_output_create(env, xml_writer);
+    if (!om_output)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                        "[tcp]Failed to create OM output");
+        axiom_xml_writer_free(xml_writer, env);
+        xml_writer = NULL;
+        return AXIS2_FAILURE;
+    }
+    
+    axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
+    
+    buffer = (axis2_char_t *)axiom_xml_writer_get_xml(xml_writer, env);
+    if (!buffer)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                        "[tcp]Failed to serialize the SOAP envelope");
+        return AXIS2_FAILURE;
+    }
+    buffer_size = axiom_xml_writer_get_xml_size (xml_writer, env);
+
+    if (is_server)
+    {
+        out_stream = axis2_msg_ctx_get_transport_out_stream (msg_ctx, env);
+        axutil_stream_write (out_stream, env, buffer, buffer_size);
+    }
+    else
+    {
+        axis2_endpoint_ref_t *to = NULL;
+        axutil_url_t *to_url = NULL;
+        const axis2_char_t *to_str = NULL;
+        const axis2_char_t *host = NULL;
+        int port = 0;
+        int socket = -1;
+        axutil_stream_t *stream;
+        int write = -1;
+        int read = -1;
+        axis2_char_t buff [1];
+        axis2_char_t *res_buffer = (axis2_char_t *)AXIS2_MALLOC (env->allocator, 
+                                                                 RES_BUFF);
+        int res_size = 0;
+        int size = 0;
+        axiom_xml_reader_t *reader = NULL;
+        axiom_stax_builder_t *builder = NULL;
+        axiom_soap_builder_t *soap_builder = NULL;
+        axiom_soap_envelope_t *soap_envelope = NULL;
+
+        to = axis2_msg_ctx_get_to (msg_ctx, env);
+
+        if (!to)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "To epr not presant");
+            return AXIS2_FAILURE;
+        }
+
+        to_str = axis2_endpoint_ref_get_address (to, env);
+        if (!to_str)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, 
+                             "unable to convert epr to string");
+            return AXIS2_FAILURE;
+        }
+
+        to_url = axutil_url_parse_string (env, to_str);
+
+        if (!to_url)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, 
+                             "unable to parser string to url");
+            return AXIS2_FAILURE;
+        }
+
+
+        host = axutil_url_get_server (to_url, env);
+        if (!host)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, 
+                             "retrieving host failed");
+            return AXIS2_FAILURE;
+        }
+
+        port = axutil_url_get_port (to_url, env);
+        if (!port)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, 
+                             "retrieving port failed");
+            return AXIS2_FAILURE;
+        }
+
+        AXIS2_LOG_DEBUG (env->log, AXIS2_LOG_SI, "host:%s port:%d",host, port);
+
+        socket = axutil_network_handler_open_socket (env, host, port);
+        if (!socket)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "socket creation failed");
+            return AXIS2_FAILURE;
+        }
+
+        stream = axutil_stream_create_socket (env, socket);
+        if (!stream)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "stream creation failed");
+            return AXIS2_FAILURE;
+        }
+
+        write = axutil_stream_write (stream, env, buffer, buffer_size);
+        if (write < 0)
+        {
+            AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "stream write error");
+            return AXIS2_FAILURE;
+        }
+        AXIS2_LOG_DEBUG (env->log, AXIS2_LOG_SI, "stream wrote soap msg: %s", 
+                         buffer);
+        size = RES_BUFF;
+        while ((read = axutil_stream_read (stream, env, &buff, 1)) > 0)
+        {
+            if (res_size >= size)
+            {
+                axis2_char_t *tmp_buff = NULL;
+                size <<= 2;
+                tmp_buff = AXIS2_MALLOC (env->allocator, size);
+                memcpy (tmp_buff, res_buffer, res_size);
+                AXIS2_FREE (env->allocator, res_buffer);
+                res_buffer = tmp_buff;
+            }
+            memcpy (res_buffer + res_size, buff, 1);
+            res_size ++;
+        }
+
+        reader = axiom_xml_reader_create_for_memory(
+            env, res_buffer, res_size, 
+            NULL, 
+            AXIS2_XML_PARSER_TYPE_BUFFER);
+
+        if (!reader)
         {
             AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
-                            "[tcp]Failed to create XML writer");
+                            "Failed to create XML reader");
             return AXIS2_FAILURE;
         }
-        
-        om_output = axiom_output_create(env, xml_writer);
-        if (!om_output)
+
+        builder = axiom_stax_builder_create(env, reader);
+        if (!builder)
         {
             AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
-                            "[tcp]Failed to create OM output");
-            axiom_xml_writer_free(xml_writer, env);
-            xml_writer = NULL;
+                            "Failed to create Stax builder");
             return AXIS2_FAILURE;
         }
-        
-        axiom_soap_envelope_serialize(soap_envelope, env, om_output, AXIS2_FALSE);
-        
-        buffer = (axis2_char_t *)axiom_xml_writer_get_xml(xml_writer, env);
-        if (!buffer)
+
+        soap_builder = axiom_soap_builder_create(
+            env, builder,
+            AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI);
+        if (!soap_builder)
         {
             AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
-                            "[tcp]Failed to serialize the SOAP envelope");
+                            "Failed to create SOAP builder");
             return AXIS2_FAILURE;
         }
-        buffer_size = axiom_xml_writer_get_xml_size (xml_writer, env);
+        soap_envelope = axiom_soap_builder_get_soap_envelope (soap_builder, env);
 
-        out_stream = axis2_msg_ctx_get_transport_out_stream (msg_ctx, env);
-        axutil_stream_write (out_stream, env, buffer, buffer_size);
+        if (!soap_envelope)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                            "Failed to create SOAP envelope");
+            return AXIS2_FAILURE;
+        }
+
+        axis2_msg_ctx_set_response_soap_envelope (msg_ctx, env, soap_envelope);
         
     }
     AXIS2_LOG_DEBUG (env->log, AXIS2_LOG_SI, "end:tcp transport sender invoke");



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org