[ 
https://issues.apache.org/jira/browse/AXIS2C-522?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Prabhakar Raju updated AXIS2C-522:
----------------------------------

    Attachment: APSAPISoap.h
                APSAPISoap.cpp

> use of  single instance of axis2_http_client_t and axis2_env_t in the 
> transport module hangs at CLIENT_RECIEVE_HEADER call after 50 message 
> transfers in win32 and about 102 transfers in linux
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: AXIS2C-522
>                 URL: https://issues.apache.org/jira/browse/AXIS2C-522
>             Project: Axis2-C
>          Issue Type: Bug
>          Components: build system (Unix/Linux), build system (Windows)
>    Affects Versions: 0.95
>         Environment: Tried in both windows (xp pro) and linux (Suse)
>            Reporter: Prabhakar Raju
>         Attachments: APSAPISoap.cpp, APSAPISoap.h
>
>
> We are using axis2/c within a c++ class. We created static variables for 
> axis2_http_client_t and axis2_env_t  in the class and trying to reuse the 
> instances for transmitting multiple messages. please note that respose also 
> reusing the same instance. This code was developed by my colleague and I'm 
> only modifying (denoted by pbkar in comments)  it to use single client 
> instance that uses the same socket stream for multiple messages.
> The files are APSAPISoap.cpp / .h
> 1) APSAPISoap.cpp
> ---------------------------------------------
> ///
> ///
> ///   @author lkrankur
> ///
> ///
> #ifdef WIN32
> #include "stdafx.h"
> #endif
> #include "APSAPISoap.h"
> #include "APSConfigData.h"
> #include "ClientLog.h"
> #include <vector>
> extern
> string trim(string* s);
> axis2_env* APSAPISoap::m_env = NULL;    // instances defined here pbkar
> axis2_http_client_t *APSAPISoap::m_http_client = NULL;
> int APSAPISoap::m_count = 0;
> //#ifdef MYDBG
> //extern std::ofstream outt;
> //#endif
> typedef struct axis2_http_simple_response_impl
> {
>     axis2_http_simple_response_t simple_response;
>     axis2_http_status_line_t *status_line;
>     axis2_array_list_t *header_group;
>     axis2_stream_t *stream;
> }
> axis2_http_simple_response_impl_t;
> #define AXIS2_INTF_TO_IMPL2(simple_response) \
>                  ((axis2_http_simple_response_impl_t *)(simple_response))
> axis2_ssize_t AXIS2_CALL
> axis2_http_simple_response_get_body_bytes1
> (
>     axis2_http_simple_response_t* simple_response,
>       const axis2_env_t* env,
>     axis2_char_t **buffer,
>       long bsize
> )
> {
>       if ( 1 > bsize ) 
>               return 0;
>       axis2_http_simple_response_impl_t* response_impl = NULL;
>       long return_size = 0;
>       
>       try
>       {
>               response_impl = AXIS2_INTF_TO_IMPL2(simple_response);
>     
>               if ( NULL == response_impl->stream )
>                       return return_size;
>               *buffer = 
>               (char *)AXIS2_MALLOC
>               (       
>                       env->allocator, 
>                       sizeof(char) * (bsize + 1)
>               );      
>               
> #ifdef MYDBG
>               int k = 1;
> #endif                                                        
>               for ( int ret = 1 ;  bsize != return_size && 0 < ret; )
>               {                                               
>                       return_size += 
>                       ret = 
>                       AXIS2_STREAM_READ
>                       (
>                               response_impl->stream, 
>                               env, 
>                               *buffer + return_size,
>                               bsize - return_size
>                       );
>                       
>                       if ( bsize == return_size || 0 == ret )
>                       {
>                               char* p = *buffer + bsize;
>                               p[0] = 0;
>                               break;
>                       }
>                       else
>                       {
> #ifdef MYDBG                                  
> //                                    cout << Log::getCurrentDateTime() << 
> "\tprocessID = " << getpid() << "\ttry in receive = " << k << ", read bytes = 
> " << return_size2 << endl;
> //                                    outt << Log::getCurrentDateTime() << 
> "\tprocessID = " << getpid() <<  "\ttry in receive = " << k << ", read bytes 
> = " << return_size2 << endl;
> //                                    ++k;
> #endif
>                               ;
>                       }
>               }
>       }
>       catch ( ... )
>       {
>               return_size = 0;
>               if ( NULL != *buffer )
>               {
>                       AXIS2_FREE(env->allocator, *buffer);
>                       *buffer = NULL;
>               }
>       }
>       return return_size;
> }
> ///
> ///   AXIS2_HTTP_CLIENT_SEND          Axis2c 0.94. 095 has memory leak 
> /// method replaces axis2_http_client_send method (in http_client.c) modified 
> to fix  
> ///
> axis2_status_t AXIS2_CALL
> axis2_http_client_send1
> (
>     axis2_http_client_t* client,
>     const axis2_env_t* env,
>     axis2_http_simple_request_t* request
> )
> {
>     static axis2_http_client_impl_t* client_impl = NULL;
>     char* wire_format = NULL;
>     axis2_array_list_t* headers = NULL;
>     char* str_body = NULL;
>     char* str_request_line = NULL;
>     int body_size = 0;
>     int written = 0;
>  
>       axis2_status_t status = AXIS2_FAILURE;
>     axis2_bool_t chunking_enabled = AXIS2_FALSE;
>     AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
> //  this code is an attempt to reset the client_impl since it was hanging 
> after 50 calls pbkar 
>       ++APSAPISoap::m_count;  
>       if (APSAPISoap::m_count >= 49){
>               client_impl->request_sent = AXIS2_TRUE;
>               APSAPISoap::m_count=0;
>               
>               if ( NULL != client_impl->data_stream )
>                       {
>                               try
>                               {
>                                       
> AXIS2_STREAM_FREE(client_impl->data_stream, env);
>                               }
>                               catch ( ... )
>                               {
>                               }
>                               client_impl->data_stream = NULL;
>                       }
>               axis2_network_handler_close_socket(env, client_impl->sockfd);
>               AXIS2_HTTP_SIMPLE_RESPONSE_FREE(client_impl->response, env);
>               //AXIS2_HTTP_CLIENT_FREE( &(client_impl->http_client), env);
>               //client_impl->http_client.ops->free( 
> &(client_impl->http_client), env);
>               //AXIS2_URL_FREE(client_impl->url, env);
>               
>               client_impl = NULL;
>       }
> // end reset client_impl
>       if(client_impl == NULL) { // code to bypass socket creation once client 
> instance created created,  pbkar 
>     client_impl = AXIS2_INTF_TO_IMPL(client);
>     if ( NULL == client_impl->url )
>     {
>         if ( NULL != env->error )
>                       AXIS2_ERROR_SET
>                       (
>                               env->error, 
>                               AXIS2_ERROR_NULL_URL, 
>                               (axis2_status_codes_t)AXIS2_FAILURE
>                       );
>         
>               return AXIS2_FAILURE;
>     }
>     
>       if ( AXIS2_TRUE == client_impl->proxy_enabled )
>     {
>         if ( NULL == client_impl->proxy_host || 0 >= client_impl->proxy_port )
>         {
>             return AXIS2_FAILURE;
>         }
>         
>               client_impl->sockfd = 
>                       axis2_network_handler_open_socket
>                       (
>                               env,
>                 client_impl->proxy_host, 
>                               client_impl->proxy_port
>                       );
>     }
>     else
>     {
>         client_impl->sockfd = 
>                       axis2_network_handler_open_socket
>                       (       
>                               env,
>                 AXIS2_URL_GET_SERVER(client_impl->url, env),
>                 AXIS2_URL_GET_PORT(client_impl->url, env)
>                       );
>     }
>       if ( 0 > client_impl->sockfd )
>     {
>         if ( NULL != env->error )
>                       AXIS2_ERROR_SET
>                       (
>                               env->error, 
>                               AXIS2_ERROR_SOCKET_ERROR, 
>                               (axis2_status_codes_t)AXIS2_FAILURE
>                       );
>         
>               return AXIS2_FAILURE;
>     }
>     /* ONLY FOR TESTING
>      * client_impl->data_stream = axis2_stream_create_file(env, 
>      *            stdout);
>      */
>     if ( 0 < client_impl->timeout )
>     {
>         axis2_network_handler_set_sock_option
>               (
>                       env, 
>                       client_impl->sockfd,
>             SO_RCVTIMEO, 
>                       client_impl->timeout
>               );
>         
>               axis2_network_handler_set_sock_option
>               (
>                       env, 
>                       client_impl->sockfd,
>             SO_SNDTIMEO, 
>                       client_impl->timeout
>               );
>     }
>     
>       if ( 0 == AXIS2_STRCASECMP
>                               (
>                                       
> AXIS2_URL_GET_PROTOCOL(client_impl->url, env),
>                                       "HTTPS"
>                               )
>       )
>     {
> #ifdef AXIS2_SSL_ENABLED
>         if ( AXIS2_TRUE == client_impl->proxy_enabled )
>         {
>             if ( AXIS2_SUCCESS != axis2_http_client_connect_ssl_host(client, 
> env,
>                     AXIS2_URL_GET_SERVER(client_impl->url, env),
>                     AXIS2_URL_GET_PORT(client_impl->url, env))
>                       )
>             {
>                 return AXIS2_FAILURE;
>             }
>         }
>         client_impl->data_stream = 
>                       axis2_stream_create_ssl
>                       ( 
>                               env,
>                 client_impl->sockfd
>                       );
> #else
>         if ( NULL != env->error )
>                       AXIS2_ERROR_SET
>                       (
>                               env->error, 
>                               AXIS2_ERROR_INVALID_TRANSPORT_PROTOCOL,
>                 (axis2_status_codes_t)AXIS2_FAILURE
>                       );
>         
>               return AXIS2_FAILURE;
> #endif
>     }
>     else
>     {
>         client_impl->data_stream = 
>                       axis2_stream_create_socket
>                       (       env,
>                 client_impl->sockfd
>                       );
>     }
>     if ( NULL == client_impl->data_stream )
>     {
>         axis2_network_handler_close_socket(env, client_impl->sockfd);
>         return AXIS2_FAILURE;
>     }
>               } // end code to bypass  pbkar
>     
>     headers = AXIS2_HTTP_SIMPLE_REQUEST_GET_HEADERS(request, env);
>       string s;
>       if ( headers )
>     {
>         int header_count = AXIS2_ARRAY_LIST_SIZE(headers, env);
>               char ee[2048] = {0};
>               for ( int i = 0; i < header_count; ++i )
>         {
>             axis2_char_t* header_ext_form = NULL;
>             
>                       axis2_http_header_t* 
>                               tmp_header = 
>                               (axis2_http_header_t 
> *)AXIS2_ARRAY_LIST_GET(headers, env, i);
>             
>                       if ( NULL == tmp_header )
>             {
>                 continue;
>             }
>             /* check whether we have transfer encoding and then see whether 
> the
>              * value is "chunked" */
>             if ( 0 == AXIS2_STRCMP(AXIS2_HTTP_HEADER_GET_NAME(tmp_header, 
> env),
>                     AXIS2_HTTP_HEADER_TRANSFER_ENCODING) && 0 ==
>                     AXIS2_STRCMP(AXIS2_HTTP_HEADER_GET_VALUE(tmp_header, 
> env), 
>                                       
> AXIS2_HTTP_HEADER_TRANSFER_ENCODING_CHUNKED) 
>                       )
>             {
>                 chunking_enabled = AXIS2_TRUE;
>             }
>             
>                       sprintf
>                       (
>                               ee, 
>                               "%s: %s%s", 
>                               tmp_header->ops->get_name(tmp_header, env),
>                               tmp_header->ops->get_value(tmp_header, env), 
>                               AXIS2_HTTP_CRLF
>                       );
>                       
>                       s += ee;                        
>         }
>       }
>       if ( AXIS2_FALSE == client_impl->proxy_enabled )
>     {
>         str_request_line = 
>                       AXIS2_HTTP_REQUEST_LINE_TO_STRING
>                       (
>                               
> AXIS2_HTTP_SIMPLE_REQUEST_GET_REQUEST_LINE(request, env), 
>                               env
>                       );
>     }
>     else
>     {
>         /* we need the request line in the format
>          * POST http://host:port/path HTTP/1.x if we have enabled proxies
>          */
>         axis2_char_t* host_port_str = NULL;
>               axis2_char_t* server = AXIS2_URL_GET_SERVER(client_impl->url, 
> env);
>               axis2_http_request_line_t* request_line =
>             AXIS2_HTTP_SIMPLE_REQUEST_GET_REQUEST_LINE(request, env);
>               axis2_char_t* path = 
> AXIS2_HTTP_REQUEST_LINE_GET_URI(request_line, env);
>         /* length = len(server) + len(:port) + len("http://";) + len(path) + 
> 1*/
>         host_port_str = 
>                       (axis2_char_t*)AXIS2_MALLOC
>                                                       (
>                                                               env->allocator, 
> AXIS2_STRLEN(server) + 
>                                                               
> AXIS2_STRLEN(path) +  
>                                                               20 * 
> sizeof(axis2_char_t)
>                                                       );
>         if ( NULL == host_port_str )
>         {
>             if ( NULL != env->error )
>                               AXIS2_ERROR_SET
>                               (
>                                       env->error, 
>                                       AXIS2_ERROR_NO_MEMORY, 
>                                       (axis2_status_codes_t)AXIS2_FAILURE
>                               );
>             
>                       return AXIS2_FAILURE;
>         }
>         sprintf
>               (
>                       host_port_str, 
>                       "http://%s:%d%s";, 
>                       server, 
>                       AXIS2_URL_GET_PORT(client_impl->url, env), 
>                       path
>               );
>         
>               str_request_line = 
>                       (char*)AXIS2_MALLOC
>                                       (
>                                               env->allocator,
>                                               AXIS2_STRLEN(host_port_str) + 
> 20 * sizeof(axis2_char_t)
>                                       );
>         
>               sprintf
>               (
>                       str_request_line, "%s %s %s\r\n",
>             AXIS2_HTTP_REQUEST_LINE_GET_METHOD(request_line, env),
>             host_port_str, 
>                       AXIS2_HTTP_REQUEST_LINE_GET_HTTP_VERSION(request_line, 
> env)
>               );
>         
>               AXIS2_FREE(env->allocator, host_port_str);
>         host_port_str = NULL;
>     }
>     
>       s = string(str_request_line) + s;       
>       AXIS2_FREE(env->allocator, str_request_line);
>     str_request_line = NULL;
>     written = AXIS2_STREAM_WRITE(client_impl->data_stream, env, s.c_str(), 
> s.size());
>    cout << "after write" << endl; 
>       AXIS2_FREE(env->allocator, wire_format);
>     wire_format = NULL;
>     
>       written = AXIS2_STREAM_WRITE(client_impl->data_stream, env, 
> AXIS2_HTTP_CRLF, 2);
>          cout << "after write crlf" << endl;
>       body_size = AXIS2_HTTP_SIMPLE_REQUEST_GET_BODY_BYTES(request, env, 
> &str_body);
>     
>       if ( 0 < body_size &&  str_body )
>     {
>         if (AXIS2_FALSE == chunking_enabled)
>         {
>             status = AXIS2_SUCCESS;
>             while ( written < body_size )
>             {
>                 written = 
>                                       AXIS2_STREAM_WRITE
>                                       (
>                                               client_impl->data_stream, 
>                                               env,
>                         str_body, 
>                                               body_size
>                                       );
>                 
>                               if ( -1 == written )
>                 {
>                     status = AXIS2_FAILURE;
>                     break;
>                 }
>             }
>         }
>         else
>         {
>             axis2_http_chunked_stream_t* chunked_stream = NULL;
>             chunked_stream = 
>                               axis2_http_chunked_stream_create(env, 
> client_impl->data_stream);
>             status = AXIS2_SUCCESS;
>             if ( NULL == chunked_stream )
>             {
>                 if ( NULL != env->log )
>                                       AXIS2_LOG_ERROR
>                                       (
>                                               env->log, 
>                                               AXIS2_LOG_SI, 
>                                               "Creation of chunked stream 
> failed"
>                                       );
>                 
>                               return AXIS2_FAILURE;
>             }
>             while ( written < body_size )
>             {
>                 written = 
>                                       AXIS2_HTTP_CHUNKED_STREAM_WRITE
>                                       (
>                                               chunked_stream, 
>                                               env,
>                         str_body, 
>                                               body_size
>                                       );
>                 
>                               if ( -1 == written )
>                 {
>                     status = AXIS2_FAILURE;
>                     break;
>                 }
>             }
>             if ( AXIS2_SUCCESS == status )
>             {
>                 AXIS2_HTTP_CHUNKED_STREAM_WRITE_LAST_CHUNK(chunked_stream, 
> env);
>             }
>             
>                       AXIS2_HTTP_CHUNKED_STREAM_FREE(chunked_stream, env);
>         }
>     }
>     client_impl->request_sent = AXIS2_TRUE;
>       if ( NULL != str_body )
>     {
>         AXIS2_FREE(env->allocator, str_body);
>         str_body = NULL;
>     }
>          cout << "after send1" << endl;       
>       return status;
> }
> /// <summary>
> /// constructor
> ///   <param name="logSoap">, [in], type = char*, path to the axis2 log 
> file</param>
> /// </summary>        
> APSAPISoap::APSAPISoap()
> :m_buffer(NULL), m_buffer2(NULL), m_body(NULL)
> {
>       m_allocator = axis2_allocator_init (NULL);
>       //m_env = axis2_env_create(m_allocator);        
>       axis2_allocator_t* allocator = axis2_allocator_init (NULL);
>       axis2_error_t* error = axis2_error_create(allocator);
> m_env = axis2_env_create_with_error(allocator, error);
> }
> /// <summary>
> /// method creates unsigned envelope
> ///   <param name="localName">, [in], type = axis2_char_t*, local name for 
> the request element</param>
> ///   <param name="localNamespace">, [in], type = axis2_char_t*, namespace 
> for the request element, could be NULL</param>
> ///   <param name="pRequest">, [in], type = RequestTO*, XACML request, could 
> be NULL</param>
> ///   <param name="applicationName">, [in], type = axis2_char_t*, application 
> name, could be NULL</param>
> /// </summary>
> bool APSAPISoap::getSoapEnvelope
> (     
>       axis2_char_t* localName, 
>       axis2_char_t* localNamespace,
>       RequestTO* pRequest, 
>       axis2_char_t* applicationName
> )
> {
>       bool fOk = false;
>       m_buffer = m_buffer2 = NULL;
>       axiom_soap_body* body = NULL;
>       axiom_soap_envelope* envelope = NULL;
>       axiom_node_t* request_om_node = NULL;
>       axiom_node_t* envelope_om_node = NULL;
>       try 
>       {
>               axiom_namespace_t* ns[] = {
>                       axiom_namespace_create (m_env,
>                                                                               
> APS::XML_NAMESPACE::SOAP_ENCODING,
>                                                                               
> "soapenc"),
>                       axiom_namespace_create (m_env, 
>                                                                               
> APS::XML_NAMESPACE::SCHEMA,
>                                                                               
> "xsd"),
>                       axiom_namespace_create (m_env,
>                                                                               
> APS::XML_NAMESPACE::SCHEMA_INSTANCE,
>                                                                          
> "xsi"),
>               };
>               
>               envelope = 
> axiom_soap_envelope_create_with_soap_version_prefix(m_env, 1, "");
>               envelope_om_node = AXIOM_SOAP_ENVELOPE_GET_BASE_NODE(envelope, 
> m_env);
>               axiom_element_t* envelope_om_ele = 
> (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(envelope_om_node, m_env);
>               
>               for ( int i = 0; i < 3; ++i ) 
>                       AXIOM_ELEMENT_DECLARE_NAMESPACE(envelope_om_ele, m_env, 
> envelope_om_node, ns[i]);
>               body = axiom_soap_body_create_with_parent(m_env, envelope);
>               request_om_node = 
>               (
>                       ( applicationName ) ? 
>                                       createRequest2(localName, 
> applicationName) 
>                                       : 
>                                       createRequest(localName, 
> localNamespace, pRequest) 
>               );
>               m_buffer2 = AXIOM_NODE_TO_STRING(request_om_node, m_env);
>               axis2_status_t status = 
>                       AXIOM_SOAP_BODY_ADD_CHILD
>                       (
>                               body, 
>                               m_env,
>                               request_om_node
>                       );
>               m_buffer = AXIOM_NODE_TO_STRING(envelope_om_node, m_env);
>               
>               fOk = true;
>                               
>               AXIOM_SOAP_ENVELOPE_FREE(envelope, m_env);              
>               envelope = NULL;
>       }
>       catch ( ... )
>       {
>               // to do logging?
>               try
>               {
>                       if ( !fOk )
>                               freeBuffers();
>                       //if ( NULL != body )
>                       //      AXIOM_SOAP_BODY_FREE(body, m_env);
>                       //if ( NULL != request_om_node )
>                       //      AXIOM_SOAP_BODY_FREE(request_om_node, m_env);
>                       //if ( NULL != envelope_om_node ) 
>                       //      AXIOM_NODE_FREE_TREE(envelope_om_node, m_env);
>                       if ( NULL != envelope )
>                               AXIOM_SOAP_ENVELOPE_FREE(envelope, m_env);
>               }
>               catch ( ... )
>               {
>                       // to do logging?
>               }
>       }
>       return fOk;
> }
> /// <summary>
> ///   method creates XACML Request element (evaluation policy)  as OM node
> ///   <param name="localName">, [in], type = axis2_char_t*, localName of 
> Request element</param>
> ///   <param name="localNamespace">, [in], type = axis2_char_t*, namespace of 
> localName of Request element</param>
> ///   <param name="pRequest">, [in], type = RequestTO*, pointer to RequestTO 
> object </param>
> /// </summary>
> axiom_node_t* APSAPISoap::createRequest
> (
>       axis2_char_t* localName, 
>       axis2_char_t* localNamespace,
>       RequestTO* pRequest
> )
> {
>       axiom_node_t* request_om_node = NULL;
>       axiom_node_t* resource_om_node = NULL;
>      axiom_element_t* resource_om_ele = NULL; 
>       axiom_node_t* action_om_node = NULL;
>     axiom_element_t* action_om_ele = NULL;    
>     
>       axiom_element_t* request_om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       NULL, 
>                       localName, 
> // to comfort signature validation have to create request without namespace
> /*                    axiom_namespace_create                  
>                       (
>                               m_env, 
>                               localNamespace, 
>                               ""
>                       )*/
>                       NULL
>                       , 
>                       &request_om_node
>               );
>       
>         SubjectTO tmpSTO = pRequest->getSubject();
>       createSubject
>       (
>               request_om_node, 
>               &tmpSTO
>       );
>       
>       createResource
>       (
>               request_om_node, 
>               (axis2_char_t*)pRequest->getResource().c_str(), 
>               (axis2_char_t*)pRequest->getScope().c_str()
>       );
>       
>       createAction
>       (
>               request_om_node, 
>               (axis2_char_t*)pRequest->getAction().c_str()
>       );
>       return request_om_node;
> }
> /// <summary>
> ///   method creates XACML Request element (RoleRequest, ResourceRequest, 
> DCRequest) as OM node
> ///   <param name="localName">, [in], type = aps_arribute_t*, localName of 
> Request element</param>
> ///   <param name="appname">, [in], type = axis2_char_t*, name of 
> application</param>
> /// </summary>        
> axiom_node_t* APSAPISoap::createRequest2
> (
>       axis2_char_t* localName, 
>       axis2_char_t* appname
> )
> {
>       axiom_node_t* request_om_node = NULL;
>       axiom_node_t* add0_om_node = NULL;
>       axiom_element_t* request_om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       NULL, 
>                       localName,
>                       NULL,
>                       &request_om_node
>               );
>       
>       axiom_element_t* add0_om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       request_om_node, 
>                       "Application", 
>                       NULL,                   
>                       &add0_om_node
>               );
>       axiom_attribute_t* attr0 = axiom_attribute_create(m_env, "Name", 
> appname, NULL);
>       AXIOM_ELEMENT_SET_NAMESPACE(add0_om_ele, m_env, NULL, add0_om_node);
>       AXIOM_ELEMENT_ADD_ATTRIBUTE(add0_om_ele, m_env, attr0, add0_om_node);
>       return request_om_node;
> }
> /// <summary>
> ///   method creates OM node for Subject element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="pSubject">, [in], type = SubjectTO*, pointer to SubjectTO 
> object</param>
> /// </summary>        
> void APSAPISoap::createSubject(axiom_node_t* parent, SubjectTO* pSubject)
> {     
>       axiom_node_t* om_node = NULL;
>     axiom_element_t* om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       parent, 
>                       "Subject",
>                       NULL,
>                       &om_node
>               );
>               
>       AXIOM_ELEMENT_ADD_ATTRIBUTE
>       (
>               om_ele, 
>               m_env, 
>               axiom_attribute_create
>               (
>                       m_env, 
>                       "SubjectCategory", 
>                       APS::XACML::SUBJECT_CATEGORY,
>                       NULL
>               ),
>               om_node
>       );
>       vector<aps_arribute_t*> attributes;
>       vector<AttributeTO> subjectAtts = pSubject->getAttributes();
>       vector<AttributeTO>::iterator attributeTO;
>       
>       for 
>       ( 
>               attributeTO = subjectAtts.begin();
>               attributeTO != subjectAtts.end();
>               attributeTO++
>       )
>       {               
>               aps_arribute_t* t = new aps_arribute_t
>                       (
>                               (axis2_char_t*)attributeTO->getID().c_str(),
>                               (axis2_char_t*)attributeTO->getType().c_str(),
>                               (axis2_char_t*)attributeTO->getValue().c_str(),
>                               m_env
>                       );
>               attributes.push_back(t);
>       }
>       addAttributes(attributes, om_node); 
>       clearAttributes(attributes);
> }
> /// <summary>
> ///   method creates OM node for Resource element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="resource">, [in], type = axis2_char_t*, resource 
> name</param>
> ///   <param name="scope">, [in], type = axis2_char_t*, scope of 
> resource</param>
> /// </summary>
> void APSAPISoap::createResource
> (
>       axiom_node_t* parent, 
>       axis2_char_t* resource, 
>       axis2_char_t* scope)
> {
>       axiom_node_t* om_node = NULL;
>       axiom_element_t* resource_om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       parent, 
>                       "Resource",
>                       NULL,
>                       &om_node
>               );
>               
>       vector<aps_arribute_t*> attributes;
>       aps_arribute_t* t = new 
> aps_arribute_t((axis2_char_t*)APS::XACML::RESOURCE_ID, 
> (axis2_char_t*)APS::XACML::RESOURCE_DEFAULT_TYPE, resource, m_env);
>       attributes.push_back(t);
>       t = new aps_arribute_t((axis2_char_t*)APS::XACML::RESOURCE_SCOPE_ID, 
> scope, m_env);
>       attributes.push_back(t);
>       addAttributes(attributes, om_node); 
>       clearAttributes(attributes);
> }
> /// <summary>
> ///   method creates OM node for Action element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="action">, [in], type = axis2_char_t*, action name</param>
> /// </summary>
> void APSAPISoap::createAction(axiom_node_t* parent, axis2_char_t* action)
> {
>       axiom_node_t* om_node = NULL;
>       axiom_element_t* om_ele = 
>               axiom_element_create
>               (
>                       m_env, 
>                       parent, 
>                       "Action",
>                       NULL,
>                       &om_node
>               );
>       vector<aps_arribute_t*> attributes;
>       aps_arribute_t* t = new 
> aps_arribute_t((axis2_char_t*)APS::XACML::ACTION_ID, action, m_env);
>       attributes.push_back(t);
>       addAttributes(attributes, om_node); 
>       clearAttributes(attributes);    
> }
> /// <summary>
> ///   method adds XACML attribute as OM element to a parent OM node
> ///   <param name="attribute">, [in], type = aps_arribute_t*, attribute info 
> </param>
> ///   <param name="parent">, [in], type = axiom_node_t*, parent OM node 
> </param>
> /// </summary>
> void APSAPISoap::addAttribute
> ( 
>       aps_arribute_t* attribute, 
>       axiom_node_t* parent
> )
> {
>       axiom_node_t* add0_om_node = NULL;
>       axiom_node_t* add1_om_node = NULL;
>       
>       axiom_element_t* add0_om_ele = 
>               axiom_element_create(m_env, parent, "Attribute", NULL, 
> &add0_om_node);
>       
>       axiom_element_t* 
>               add1_om_ele = axiom_element_create(m_env, add0_om_node, 
> "AttributeValue", NULL, &add1_om_node);
>       axiom_attribute_t* attr0 = axiom_attribute_create(m_env, "AttributeId", 
> attribute->attributeId, NULL);
>       axiom_attribute_t* attr1 = axiom_attribute_create(m_env, "DataType", 
> attribute->dataType, NULL);
>       AXIOM_ELEMENT_SET_NAMESPACE(add0_om_ele, m_env, NULL, add0_om_node);
>       AXIOM_ELEMENT_ADD_ATTRIBUTE(add0_om_ele, m_env, attr0, add0_om_node);
>       AXIOM_ELEMENT_ADD_ATTRIBUTE(add0_om_ele, m_env, attr1, add0_om_node);
>       AXIOM_ELEMENT_SET_TEXT(add1_om_ele, m_env, attribute->dataValue, 
> add1_om_node);
> }
> /// <summary>
> ///   method adds XACML attributes as OM elements to parent node 
> ///   <param name="attributes">, [in], type = vector<aps_arribute_t*>, 
> collection of attribute info </param>
> ///   <param name="parent">, [in], type = axiom_node_t*, parent OM node 
> </param>
> /// </summary>
> void APSAPISoap::addAttributes
> (
>       vector<aps_arribute_t*> attributes, 
>       axiom_node_t* parent
> )
> {
>       vector<aps_arribute_t*>::iterator iter;
>       for ( iter = attributes.begin(); iter != attributes.end(); iter++ ) 
>       {
>               addAttribute(*iter, parent);
>       }
> }
> /// <summary>
> ///   method clears collections of aps_arribute_t*
> ///   <param name="attributes">, [in], type = vector<aps_arribute_t*>& 
> </param>
> /// </summary>
> void APSAPISoap::clearAttributes(vector<aps_arribute_t*>& attributes)
> {
>       try 
>       {
>               while ( 0 < attributes.size() )
>               {
>                       aps_arribute_t* t = attributes[attributes.size()-1];
>                       attributes.pop_back();
>                       m_allocator->free_fn(m_allocator, t->attributeId);
>                       m_allocator->free_fn(m_allocator, t->dataType);
>                       m_allocator->free_fn(m_allocator, t->dataValue);
>                       delete t;
>               }
>       }
>       catch ( ... )
>       {
>               // to do logging?
>       }
>       
>       attributes.clear();
> }
> /// <summary>
> /// method logs send/receive SOAP over HTTP   
> ///   <param name="attempt">, [in], type = integer, attempt tried</param>
> ///   <param name=buffer>, [in], type = integer, number of attempts 
> configured</param>
> ///   <param name="method">, [in], type = char*, message that sent</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> ///   <param name="status">, [in], type = integer, HTTP code returned (if 
> any)</param>
> /// </summary>        
> void APSAPISoap::logSoap
> (
>       int attempt, 
>       int retry, 
>       char* buffer, 
>       SOAPResponseMessage* pResponseMsg, 
>       int status
> )
> {
>       int level = APSConfigData::getInstance().getLogLevel();
>       bool fOk = (200 == status || 500 == status);
>       if ( APS::LOG_ERROR <= level )
>       {               
>               char msg[512] = {0};
>               char* f[] = {"st", "nd", "rd", "th"}; 
>               string warning;
>               sprintf
>               (
>                       msg, 
>                       "%d%s attempt (from %d) to retry sending SOAP message 
> %s. ", 
>                       attempt+1, f[( attempt < 3 ) ? attempt : 3],
>                       retry,
>                       fOk ? "succeed" : "failed"
>               );
>               warning += msg;
>               if ( ( 200 != status ) && 
>                       (pResponseMsg->getStatusTransportDescription().size() 
> || pResponseMsg->getStatusHTTPDescription().size() )
>               )
>               {
>                       warning += string( fOk ? " Warning" : " Error") + 
> string(" description: ") + 
>                       pResponseMsg->getStatusTransportDescription() + 
>                       string( 
> pResponseMsg->getStatusTransportDescription().size() ? ". " : "" ) +
>                       pResponseMsg->getStatusHTTPDescription();
>                       
>                       warning = trim(&warning);
>                       for ( int i = 1; i < 3; ++i )
>                               if ( 10 == warning.c_str()[warning.size()-1] || 
> 13 == warning.c_str()[warning.size()-1] )
>                                       warning.erase(warning.size()-1, 1);
>                       warning = trim(&warning);
>                       if ( '.' != warning.c_str()[warning.size()-1] && '.' != 
> warning.c_str()[warning.size()-2] )
>                               warning += ". ";
>               }
>               else
>                       warning += "\n";
>               if ( APS::LOG_INFO <= level && NULL != buffer && 500 == status )
>               {
>                       warning += "SOAP fault:\r"; 
>                       warning += buffer; 
>                       warning += "\n";
>               }
>               if ( warning.size() )
>               {
>                       int msgtype = fOk ? ( 200 == status ? APS::LOG_INFO : 
> APS::LOG_WARNING )
>                                                                               
> : APS::LOG_ERROR;
>                       if ( msgtype <= level )
>                               ClientLog::getInstance().saveMsg(warning, 
> msgtype);             
>               }
>       }
> }
> /// <summary>
> /// sends Request SOAP message over HTTP
> ///   <param name="envlopebuffer">, [in], type = char*, buffer - keeps signed 
> SOAP envelope</param>
> ///   <param name="url">, [in], type = axis2_char_t*, path to the service 
> fotmat (pdp location)/(service)</param>
> ///   <param name="method">, [in], type = axis2_char_t*, service method - 
> soap action</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> ///   <param name="int">, [in], type = int, number of attempts when 
> failure</param>
> ///   <param name="int">, [in], type = int, interval in min? between attempts 
> when failure</param>
> /// </summary>        
> bool APSAPISoap::sendSoapEnvelope
> (
>       char* envlopebuffer, 
>       axis2_char_t* url_str, 
>       axis2_char_t* method,
>       SOAPResponseMessage* pResponseMsg,
>       int retry,                                                              
> // default = 1
>       int timeout                                                             
> // default = 10
> )
> {
>       int tt = strlen(url_str) + strlen(method);
>       
>       if ( 0 > retry && 3 < retry )
>               retry = 1;
>       if ( 0 > timeout && 10 < timeout ) 
>               timeout = 10;
>       bool fOk = false;
>       axis2_url_t* url = NULL;
>       //axis2_http_client_t* http_client = NULL;
>       axis2_http_simple_request_t* simple_request = NULL;     
>       
>       m_body = NULL;
>       int status = AXIS2_FAILURE; // AXIS2_SUCCESS;   
>       if ( NULL != envlopebuffer && strlen(envlopebuffer) )
>       {
>       
> #ifdef MYDBG
> //    FILE *fp = fopen("C:\\Myfiles\\temp\\mysigned.xml","w");
> //    fprintf(fp,"%s", envlopebuffer);
> //    fclose(fp);
> //    cout << "SOAP envelope with signed request sent to 
> C:\\Myfiles\\temp\\mysigned.xml" << endl;
> //getchar();
> #endif                
>                       
>               char content_lenght[17] = {0};
>               sprintf((char*)&content_lenght, "%d", strlen(envlopebuffer)); 
>               axis2_http_header_t* header_host = NULL;
>               axis2_http_header_t* header_soap_action = NULL;
>               axis2_http_header_t* header_content_type = NULL;
>               axis2_http_header_t* header_content_lenght = NULL;      
>               axis2_http_request_line_t* request_line = NULL;
>               for ( int i = 0; i < retry; ++i )
>               {                       
>       
>                       url = axis2_url_parse_string(m_env, url_str);
>       
>                       request_line = 
>                               axis2_http_request_line_create
>                               (
>                                       m_env, 
>                                       AXIS2_HTTP_HEADER_POST, 
>                                       AXIS2_URL_GET_PATH(url, m_env), 
>                                       AXIS2_HTTP_HEADER_PROTOCOL_11
>                               ); 
>       
>                       simple_request = 
>                               axis2_http_simple_request_create
>                               (
>                                       m_env, 
>                                       request_line, 
>                                       NULL, 
>                                       0, 
>                                       NULL
>                               );
>       
>                       // create HTTP headers
>                       header_host = 
>                               axis2_http_header_create
>                               (       
>                                       m_env, 
>                                       AXIS2_HTTP_HEADER_HOST, 
>                                       AXIS2_URL_GET_SERVER(url, m_env)
>                               );
>               
>                       header_soap_action = 
>                               axis2_http_header_create
>                               (       
>                                       m_env, 
>                                       AXIS2_HTTP_HEADER_SOAP_ACTION, 
>                                       method
>                               );
>                       
>                       header_content_type = 
>                               axis2_http_header_create
>                               (
>                                       m_env, 
>                                       AXIS2_HTTP_HEADER_CONTENT_TYPE,
>                                       AXIS2_HTTP_HEADER_ACCEPT_TEXT_XML
>                               );
>               
>                       header_content_lenght = 
>                               axis2_http_header_create
>                               (
>                                       m_env, 
>                                       AXIS2_HTTP_HEADER_CONTENT_LENGTH, 
>                                       (const axis2_char_t *)&content_lenght
>                               );
>       
>                       //      add HTTP headers
>                       AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER
>                       (
>                               simple_request, 
>                               m_env, 
>                               header_host
>                       );
>                       
>                       AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER
>                       (       
>                               simple_request,
>                               m_env,
>                               header_soap_action
>                       );
>                       
>                       AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER
>                       (       
>                               simple_request, 
>                               m_env, 
>                               header_content_type
>                       );
>                       
>                       AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER
>                       (
>                               simple_request,
>                               m_env, 
>                               header_content_lenght
>                       );
>                       
>                       AXIS2_HTTP_SIMPLE_REQUEST_SET_BODY_STRING
>                       (
>                               simple_request, 
>                               m_env, 
>                               envlopebuffer
>                       );
>       
>                                       if(m_http_client == NULL) {
>                      m_http_client = axis2_http_client_create(m_env, url); 
>                               }
>                                       
> AXIS2_HTTP_CLIENT_SET_TIMEOUT(m_http_client, m_env, TIMEOUT);
>                       // send request to server
>                       try
>                       {
>                               status = 
>                                       //AXIS2_HTTP_CLIENT_SEND                
> temporarely commented,  Axis2c 0.94. 095 has memory leak 
>                                       //(     
>                                       //      http_client, 
>                                       //      m_env, 
>                                       //      simple_request
>                                       //)
>                                       axis2_http_client_send1(m_http_client, 
> m_env, simple_request);
>                                       ;
>                       }
>                       catch ( ... )
>                       {
>                       }
>                       
>                       int statCode = getHTTPResponse(status, m_http_client, 
> pResponseMsg);
>                       logSoap(i, retry, m_body, pResponseMsg, statCode);
>                       if ( 1 < retry && mustRetry(statCode) )
>                       {                               
> #ifdef WIN32
>                               Sleep(timeout*1000);
> #else
> //                            sleep(timeout);
> #endif
> #ifdef MYDBG
>                               //cout << Log::getCurrentDateTime() << "\tsend 
> try = " << i+1 << ", statcode = " << statCode << endl;
>                               //outt << Log::getCurrentDateTime() << "\tsend 
> try = " << i+1 << ", statcode = " << statCode << endl;
> #endif                        
>                       }
>                       else
>                               break;
>                       freeBuffer(&m_body);
>                       freeSimpleRequest(&simple_request);
>                       //freeClient(&http_client);
>               }       
>               if ( NULL != m_body )
>                       fOk = isResponseValid(pResponseMsg);
>       }
>       else
>       {
>               pResponseMsg->setStatusTransport(status);
>               pResponseMsg->setStatusTransportDescription(string("SEND 
> failure .......... nothing to send!"));
>       }
>       freeBuffer(&m_body);
>       freeSimpleRequest(&simple_request);
>       //freeClient(&m_http_client);
>       return (fOk);
> }
> /// <summary>
> /// method gets HTTP response (axis2_simple_response)
> ///   <param name="status">, [in], type = integer, status</param>
> ///   <param name="http_client">, [in], type = axis2_http_client_t*, axis2 
> http_client</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// <returns> type = int, status</returns>
> /// </summary>        
> int APSAPISoap::getHTTPResponse
> (
>       int status0,
>       axis2_http_client_t* http_client,
>       SOAPResponseMessage* pResponseMsg
> )
> {
>       int status = status0;
>       char cStatus[256] = {0};
>       
>       freeBuffer(&m_body);
>       pResponseMsg->setStatusTransport(status);
>       
>       if ( status < 0 )
>       {               
>               sprintf((char*)cStatus, "SEND Failed .........Can't send the 
> request. Status :%d", status);
>               pResponseMsg->setStatusTransportDescription(string(cStatus));
> #ifdef MYDBG
>               // debug
>               printf("%s\n", cStatus);
>               // degug
> #endif
>               return (status);
>       }
>                          cout << "before recv header" << endl;
>                          //cout << AXIS2_ERROR_GET_MESSAGE(m_env->error) << 
> endl;
>       status = AXIS2_HTTP_CLIENT_RECIEVE_HEADER(http_client, m_env);
>                  cout << "after recv header" << endl;
>       
>       if ( status < 0 )
>       {
>               cout << AXIS2_ERROR_GET_MESSAGE(m_env->error) << endl;
>               sprintf((char*)cStatus, "SEND Failed ......... Can't recieve. 
> Status :%d", status);
>               pResponseMsg->setStatusTransportDescription(string(cStatus));
> #ifdef MYDBG
>               // debug
>               printf("%s\n", cStatus);
>               //debug
> #endif
>               return (status);
>       }
>          cout << "before get response" << endl; 
>       axis2_http_simple_response_t* 
>               simple_response = AXIS2_HTTP_CLIENT_GET_RESPONSE(http_client, 
> m_env);
>          cout << "after get response" << endl;
>       if ( NULL == simple_response )
>       {
>               pResponseMsg->setStatusTransportDescription("SEND Failed : NULL 
> response");
> #ifdef MYDBG
>               // debug
>               printf("SEND Failed : NULL response");
>               // debug
> #endif
>               return (-1);
>       }
>       
>       sprintf((char*)&cStatus, "%d", 
> AXIS2_HTTP_SIMPLE_RESPONSE_GET_STATUS_CODE(simple_response, m_env));     
>       pResponseMsg->setStatusHTTP(string(cStatus));
>       pResponseMsg->setStatusHTTPDescription
>       (
>               
> string(AXIS2_HTTP_SIMPLE_RESPONSE_GET_STATUS_LINE(simple_response, m_env))
>       );
> #ifdef MYDBG
> // debug
>       printf("Content Type :%s\n", 
> AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_TYPE(
>                                               simple_response, m_env));
>       printf("Content Length :%d\n", 
> AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(
>                                               simple_response, m_env));
>       printf("Status code :%d\n", status);
> // debug              
> #endif
>       if ( 200 == status || 500 == status )
>       {
>               bool fOk = false;
>               try 
>               {
>                       char msg[512] = {0};
>                       
>                       int len2 = 0;
>                       
>                       for ( int i = 0; 3 > i; ++i ) 
>                               if ( 0 < (len2 = 
> AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(simple_response, m_env) ) )
>                                       break;
>                       
>                       if ( fOk = ( 0 < len2 ) )
>                       {
>                               fOk = false;
>                               try 
>                               {
> //                                    int len = 
> AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY_BYTES(simple_response, m_env, &m_body);
>                                       int len = 
> axis2_http_simple_response_get_body_bytes1(simple_response, m_env, &m_body, 
> len2);
>                                                  cout << "after get body 
> bytes1" << endl;
>                                       
>                                       if ( len != len2 )
>                                       {
> #ifdef MYDBG
> //                                            cout << 
> Log::getCurrentDateTime() << "\tprocessID = " << getpid() << "\tlen get body 
> = " << len << ", len2 get content = " << len2 << endl;
> //                                            outt << 
> Log::getCurrentDateTime() << "\tprocessID = " << getpid() << "\tlen get body 
> = " << len << ", len2 get content = " << len2 << endl;                        
>      
> #endif
>                                               
> pResponseMsg->setStatusHTTP("-1");
>                                               sprintf(msg, "Response body 
> length = %d is less than stated in content length header = (%d)", len2, len); 
>                                               
> pResponseMsg->setStatusHTTPDescription(msg);
>                                               freeBuffer(&m_body);
>                                               return (-1);
>                                       }
>                                       
> pResponseMsg->setEnvelope(string(m_body));
>                                       fOk = true;
>                               }
>                               catch ( ... )
>                               {
>                               
>                               }
>                       }
>                       else
>                       {
>                               pResponseMsg->setStatusHTTP("-1");
>                               pResponseMsg->setStatusHTTPDescription("Content 
> length is 0");
>                               return (-1);
>                       }
>               }
>               catch ( ... )
>               {
>               
>               }
> #ifdef MYDBG
>       // debug
> //            printf("body :%s\n", ( fOk && (NULL != m_body ) ) ? m_body : " 
> response content is empty");
>       //debug    
> #endif
>               if ( !fOk ) 
>               {
>                       pResponseMsg->setStatusHTTPDescription("Response 
> content is empty");
>                       pResponseMsg->setStatusHTTP(string("500"));
>                       status = 500;
>               }
>       }
>       return (status);
> }
> /// <summary>
> /// method validates response
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// <returns> type = bool, validaty of response, no faults - response HTTP 
> code = 200 (OK)</returns>
> /// </summary>        
> bool APSAPISoap::isResponseValid
> (
>       SOAPResponseMessage* pResponseMsg
> )  
> {
>       bool fOk = false;       
>       axiom_soap_envelope_t* soap_envelope = NULL;
>       axiom_soap_builder_t* soap_builder = NULL;
>       axiom_stax_builder_t* om_builder = NULL;
>       axiom_xml_reader_t* xml_reader = NULL;
>       axiom_soap_body* body = NULL;
>       axiom_soap_fault_t*     fault = NULL;
>       
>       try
>       {
>               xml_reader = 
>                       axiom_xml_reader_create_for_memory
>                       (       
>                               m_env, 
>                               (void*)m_body, 
>                               strlen(m_body),
>                               AXIS2_UTF_8,
>                               AXIS2_XML_PARSER_TYPE_BUFFER
>                       );
>               
>               om_builder = 
>                       axiom_stax_builder_create(m_env, xml_reader);
>               soap_builder = 
>                       axiom_soap_builder_create
>                       (
>                               m_env, 
>                               om_builder, 
>                               AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI
>                       );
>               soap_envelope = 
>                        AXIOM_SOAP_BUILDER_GET_SOAP_ENVELOPE(soap_builder, 
> m_env);
>               body = 
>                       AXIOM_SOAP_ENVELOPE_GET_BODY(soap_envelope, m_env);
>               if ( AXIOM_SOAP_BODY_HAS_FAULT(body, m_env) )
>               {   
>                       // SOAP fault, HTTP code = 500, and NULL != m_body  
>                       pResponseMsg->setBodyHasFault(true);
>                       parseFault
>                       ( 
>                               fault = AXIOM_SOAP_BODY_GET_FAULT(body, m_env),
>                               pResponseMsg
>                       );
> #ifdef MYDBG
>                       // debug
>                       printf("BODY HAS A FAULT");             
>                       // debug
> #endif
>               }
>               else
>               {
>                       // OK, HTTP code = 200
>                       fOk = true;
>                       axis2_char_t* t = AXIOM_NODE_TO_STRING
>                       (
>                               AXIOM_NODE_GET_FIRST_CHILD
>                               (
>                                       AXIOM_SOAP_BODY_GET_BASE_NODE(body, 
> m_env), 
>                                       m_env
>                               ),
>                               m_env
>                       );
>                       string response = t;
>                       AXIS2_FREE(m_env->allocator, t);
>                       
>                       // to comfort signature validation
>                       int pos = string::npos;
>                       while ( string::npos != (pos = response.find(" 
> xmlns=\"\"") ) )
>                       response.erase(pos, 9);                 
>                       
>                       pResponseMsg->setResponse(response);
>               }
>               
>               // cleanup
>               try
>               {
>                       freeBuffer(&m_body);
>                                               
>                       if ( NULL != soap_envelope )
>                               AXIOM_SOAP_ENVELOPE_FREE(soap_envelope, m_env);
> #ifdef SOLARIS        
> // axis95 (build on solaris CC) does not release om_stax_builder! 
> // freeing om_stax_builder on WIN32 and Linux is crashing!
>                       if ( NULL != om_builder )
>                               AXIOM_STAX_BUILDER_FREE(om_builder, m_env);
> #endif
>               }
>               catch ( ... )
>               {
>       
>               }
>       }
>       catch ( ... )
>       {
>               freeBuffer(&m_body);
>       }
> #ifdef MYDBG
> //debug
>       printf("\nFinished http_client send ..........\n\n");
> // debug      
> #endif
>       
>       return (fOk);
> }
> /// <summary>
> /// method parses SOAP fault element
> ///   <param name="fault">, [in], type = axiom_soap_fault_t*, soap 
> fault</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// </summary>        
> void APSAPISoap::parseFault
> (
>       axiom_soap_fault_t* fault,
>       SOAPResponseMessage* pResponseMsg
> )
> {
>       axiom_soap_fault_code* 
>               code = AXIOM_SOAP_FAULT_GET_CODE(fault, m_env);
>       if ( NULL != code )
>       {       
>               axiom_soap_fault_value_t* 
>                       value = AXIOM_SOAP_FAULT_CODE_GET_VALUE(code, m_env);
>       
>               if ( NULL != value )            
>                       
> pResponseMsg->setFaultCode((char*)AXIOM_SOAP_FAULT_VALUE_GET_TEXT(value, 
> m_env));
>       }
>       axiom_soap_fault_reason* 
>               reason = AXIOM_SOAP_FAULT_GET_REASON(fault, m_env);
>       if ( NULL != reason )
>       {
>               try
>               {
>                       axiom_soap_fault_text* 
>                               reason_text = 
> AXIOM_SOAP_FAULT_REASON_GET_FIRST_SOAP_FAULT_TEXT(reason, m_env);         // 
> faultstring
>                       if ( NULL != reason_text )
>                               
> pResponseMsg->setFaultReason(AXIOM_SOAP_FAULT_TEXT_GET_TEXT(reason_text, 
> m_env));                       // faultstring CDATA
>               }
>               catch ( ... )
>               {
>               }
>       }
> }
> /// <summary>
> /// destructor
> /// cleanup
> /// </summary>        
> APSAPISoap::~APSAPISoap(void)
> {     
>     //freeClient(&m_http_client);  //commented this as the instance is no 
> longer recreated for every request pbkar
>       freeBuffers();
>       axis2_env_free(m_env);
> }
> ------------------------------------------------------------
> 2) APSAPISoap.h
> ///
> ///
> ///   @author lkrankur
> ///
> ///
> //#pragma once
> #ifndef APSAPISOAP_H
> #define APSAPISOAP_H
> #include "Extern.h"
> #include "APSAPISoapUtil.h"
> #include "RequestTO.h"
> #include "SOAPResponseMessage.h"
> #include "APSConfigData.h"
> #include <vector>
> using namespace std;
> const int TIMEOUT = 60000;
> /// <summary>
> ///Info of XACML attribute
> /// </summary>
> struct aps_arribute_t
> {
> ///   
>       axis2_char_t* attributeId;
> ///
>       axis2_char_t* dataType;
> ///
>       axis2_char_t* dataValue;
> /// constructor
>       aps_arribute_t(axis2_env_t* env)
>       {
>               dataType = 
> (axis2_char_t*)AXIS2_STRDUP(APS::XACML::ATTRIBUTE_DEFAULT_TYPE, env);  
> //"http://www.w3.org/2001/XMLSchema#string";;
>       };
> /// <summary>
> /// constructor
> ///   <param name="id">, [in], type = axis2_char_t*, AttributeID of attribute 
> element </param>
> ///   <param name="value">, [in], type = axis2_char_t*, DataValue of 
> attribute element </param>
> /// </summary>
>       aps_arribute_t(axis2_char_t* id, axis2_char_t* value, axis2_env_t* env)
>       {
>               attributeId = (axis2_char_t*)AXIS2_STRDUP(id, env);     
>               dataType = 
> (axis2_char_t*)AXIS2_STRDUP(APS::XACML::ATTRIBUTE_DEFAULT_TYPE, env);
>               dataValue = (axis2_char_t*)AXIS2_STRDUP(value, env);
>       };
> /// <summary>
> /// constructor
> ///   <param name="id">, [in], type = axis2_char_t*, AttributeID of attribute 
> element </param>
> ///   <param name="id">, [in], type = axis2_char_t*, DataType of attribute 
> element </param>
> ///   <param name="value">, [in], type = axis2_char_t*, DataValue of 
> attribute element </param>
> /// </summary>
>       aps_arribute_t(axis2_char_t* id, axis2_char_t* type, axis2_char_t* 
> value, axis2_env_t* env)
>       {
>               attributeId = (axis2_char_t*)AXIS2_STRDUP(id, env);
>               dataType = (axis2_char_t*)AXIS2_STRDUP(type, env);
>               dataValue = (axis2_char_t*)AXIS2_STRDUP(value, env);
>       };
> };
> /// 
> ///   struct to use in fixing Axis2c 0.94. 095 memory leak 
> /// axis2_http_client implementation
> ///
> typedef struct axis2_http_client_impl
> {
>     axis2_http_client_t http_client;
>     int sockfd;
>     axis2_stream_t *data_stream;
>     axis2_url_t *url;
>     axis2_http_simple_response_t *response;
>     axis2_bool_t request_sent;
>     int timeout;
>     axis2_bool_t proxy_enabled;
>     axis2_char_t *proxy_host;
>     int proxy_port;
>     axis2_char_t *proxy_host_port;
> }
> axis2_http_client_impl_t;
>     
> #define AXIS2_INTF_TO_IMPL(http_client)    ((axis2_http_client_impl_t 
> *)(http_client))
> /// <summary>
> ///   ASP SOAP processing 
> /// </summary>
> class APSAPISoap
> {
> ///   axis2 environment
>       public:
>             
>             static axis2_env_t* m_env;  // made static for single instance  
> pbkar
>             static axis2_http_client_t* m_http_client;
>                       static int m_count;
>         
> /// axis2 memory allocation
>       axis2_allocator_t* m_allocator;
> ///
>       axis2_char_t* m_buffer;
>       axis2_char_t* m_buffer2;
>       axis2_char_t* m_body;   // http body
> void freeOMElement(axiom_element_t* om_element);
> void freeOMNode(axiom_node_t* om_node);
> /// <summary>
> ///   method adds XACML attributes as OM elements to parent node 
> ///   <param name="attributes">, [in], type = vector<aps_arribute_t*>, 
> collection of attribute info </param>
> ///   <param name="parent">, [in], type = axiom_node_t*, parent OM node 
> </param>
> /// </summary>
>       void addAttributes
>       (
>               vector<aps_arribute_t*> attributes, 
>               axiom_node_t* parent
>       );
> /// <summary>
> ///   method adds XACML attribute as OM element to a parent OM node
> ///   <param name="attribute">, [in], type = aps_arribute_t*, attribute info 
> </param>
> ///   <param name="parent">, [in], type = axiom_node_t*, parent OM node 
> </param>
> /// </summary>
>       void addAttribute
>       ( 
>               aps_arribute_t* attribute, 
>               axiom_node_t* parent
>       );
> /// <summary>
> ///   method clears collections of aps_arribute_t*
> ///   <param name="attributes">, [in], type = vector<aps_arribute_t*>& 
> </param>
> /// </summary>
> void clearAttributes(vector<aps_arribute_t*>& attributes);
> /// <summary>
> ///   method creates XACML Request element (evaluation policy)  as OM node
> ///   <param name="localName">, [in], type = axis2_char_t*, localName of 
> Request element</param>
> ///   <param name="localNamespace">, [in], type = axis2_char_t*, namespace of 
> localName of Request element</param>
> ///   <param name="pRequest">, [in], type = RequestTO*, pointer to RequestTO 
> object </param>
> /// </summary>
>       axiom_node_t* createRequest
>       (
>               axis2_char_t* localName,
>               axis2_char_t* localNamespace,
>               RequestTO* pRequest
>       );
> /// <summary>
> ///   method creates XACML Request element (RoleRequest, ResourceRequest, 
> DCRequest) as OM node
> ///   <param name="localName">, [in], type = axis2_char_t*, localName of 
> Request element</param>
> ///   <param name="appname">, [in], type = axis2_char_t*, name of 
> application</param>
> /// </summary>        
>       axiom_node_t* createRequest2
>       (
>               axis2_char_t* localName, 
>               axis2_char_t* appname
>       );
> /// <summary>
> ///   method creates OM node for Subject element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="pSubject">, [in], type = SubjectTO*, pointer to SubjectTO 
> object</param>
> /// </summary>        
>       void createSubject
>       (
>               axiom_node_t* request, 
>               SubjectTO* subject
>       );
> /// <summary>
> ///   method creates OM node for Resource element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="resource">, [in], type = axis2_char_t*, resource 
> name</param>
> ///   <param name="scope">, [in], type = axis2_char_t*, scope of 
> resource</param>
> /// </summary>        
>       void createResource
>       (
>               axiom_node_t* request, 
>               axis2_char_t* resource, 
>               axis2_char_t* scope
>       );
> /// <summary>
> ///   method creates OM node for Action element and adds to Request node
> ///   <param name="request">, [in], type = axiom_node_t*, request node</param>
> ///   <param name="action">, [in], type = axis2_char_t*, action name</param>
> /// </summary>
>       void createAction
>       (
>               axiom_node_t* request, 
>               axis2_char_t* action
>       );
> /// <summary>
> /// method logs send/receive SOAP over HTTP   
> ///   <param name="attempt">, [in], type = integer, attempt tried</param>
> ///   <param name=buffer>, [in], type = integer, number of attempts 
> configured</param>
> ///   <param name="method">, [in], type = char*, message that sent</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> ///   <param name="status">, [in], type = integer, HTTP code returned (if 
> any)</param>
> /// </summary>        
>       void logSoap
>       (
>               int attempt,
>               int retry,
>               char* buffer, 
>               SOAPResponseMessage* pResponseMsg,
>               int status
>       );
>       void freeClient(axis2_http_client_t** http_client)
>       {
>               if ( NULL != *http_client )
>               {
>                       axis2_http_client_impl_t* client_impl = 
> AXIS2_INTF_TO_IMPL(*http_client);
>                       
>                       if ( NULL != client_impl->data_stream )
>                       {
>                               try
>                               {
>                                       
> AXIS2_STREAM_FREE(client_impl->data_stream, m_env);
>                               }
>                               catch ( ... )
>                               {
>                               }
>                               client_impl->data_stream = NULL;
>                       }
>                       try
>                       {       
>                               AXIS2_HTTP_CLIENT_FREE(*http_client, m_env); 
>                       }
>                       catch ( ... )
>                       {
>                       }
>               }
>               
>               *http_client = NULL;
>       }
>       void freeSimpleRequest(axis2_http_simple_request_t** simple_request)
>       {
>               if ( NULL != *simple_request)
>               {
>                       try
>                       {
>                               AXIS2_HTTP_SIMPLE_REQUEST_FREE(*simple_request, 
> m_env);
>                       }
>                       catch ( ... )
>                       {
>                       }
>                       *simple_request = NULL;
>               }
>       }
> public:
> /// <summary>
> /// constructor
> /// </summary>        
>       APSAPISoap();
> /// <summary>
> /// method creates unsigned envelope
> ///   <param name="localName">, [in], type = axis2_char_t*, local name for 
> the request element</param>
> ///   <param name="localNamespace">, [in], type = axis2_char_t*, namespace 
> for the request element, could be NULL</param>
> ///   <param name="pRequest">, [in], type = RequestTO*, XACML request, could 
> be NULL</param>
> ///   <param name="applicationName">, [in], type = axis2_char_t*, application 
> name, could be NULL</param>
> /// </summary>
>       bool getSoapEnvelope
>       (
>               axis2_char_t* localName, 
>               axis2_char_t* localNamespace, 
>               RequestTO* pRequest, 
>               axis2_char_t* applicationName
>       );
> /// <summary>
> /// method sends Request SOAP message over HTTP
> ///   <param name="envlopebuffer">, [in], type = char*, buffer - keeps signed 
> SOAP envelope</param>
> ///   <param name="url">, [in], type = axis2_char_t*, path to the service 
> fotmat (pdp location)/(service)</param>
> ///   <param name="method">, [in], type = axis2_char_t*, service method - 
> soap action</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> ///   <param name="int">, [in], type = int, number of attempts when 
> failure</param>
> ///   <param name="int">, [in], type = int, interval in sec between attempts 
> when connection failure</param>
> /// <returns> type = bool, success in sending HTTP</returns>
> /// </summary>        
>       bool sendSoapEnvelope
>       (
>               char* envelope,
>               axis2_char_t* url, 
>               axis2_char_t* method,
>               SOAPResponseMessage* pResponseMsg,
>               int retry = 1, 
>               int timeout = 10
>       );
> /// <summary>
>       /// method gets HTTP response (axis2_simple_response)
> ///   <param name="status">, [in], type = integer, status</param>
> ///   <param name="http_client">, [in], type = axis2_http_client_t*, axis2 
> http_client</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// <returns> type = int, status</returns>
> /// </summary>        
>       int getHTTPResponse
>       (
>               int status,
>               axis2_http_client_t* http_client,
>               SOAPResponseMessage* pResponseMsg
>       );
> /// <summary>
> /// method validates response
> ///   <param name="status">, [in], type = integer, status</param>
> /// <returns> type = bool, sending request needs retry</returns>
> /// </summary>        
>       bool mustRetry(int status)
>       {
>               return 
> APSConfigData::getInstance().getPdpLocation().StatusCodeForceRetry(status);
>       };
> /// <summary>
> /// method validates response
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// <returns> type = bool, validaty of response, no faults - response HTTP 
> code = 200 (OK)</returns>
> /// </summary>        
>       bool isResponseValid
>       (
>               SOAPResponseMessage* pResponseMsg
>       );
> /// <summary>
> /// method parses SOAP fault element
> ///   <param name="fault">, [in], type = axiom_soap_fault_t*, soap 
> fault</param>
> ///   <param name="pResponseMsg">, [in], type = SOAPResponseMessage*, pointer 
> to SOAPResponseMessage object</param>
> /// </summary>        
>       void parseFault
>       (
>               axiom_soap_fault_t* fault,
>               SOAPResponseMessage* pResponseMsg
>       );
> /// <summary>
> ///   accessor get    buffer, keeps SOAP envelope
> /// <returns> type = axis2_char_t*, buffer, keeps SOAP envelope
> /// </summary>
>       axis2_char_t* getBuffer()
>       {
>               return m_buffer;
>       }
> /// <summary>
> ///   accessor get    buffer, keeps first child of SOAP body
> /// <returns> type = axis2_char_t*, buffer, keeps first child of SOAP bod
> /// </summary>        
>       axis2_char_t* getBuffer2()
>       {
>               return m_buffer2;
>       }       
>       void freeBuffer(axis2_char_t** buffer)
>       {
>               if ( NULL != *buffer )
>               {
>                       try
>                       {       
>                               AXIS2_FREE(m_env->allocator, *buffer);
>                       }                               
>                       catch ( ... )
>                       {
>                       }
>                       
>                       *buffer = NULL;
>               }
>       }
>       
>       
> /// <summary>
> ///   method frees  m_buffer, m_buffer2
> /// </summary>        
>       void freeBuffers()
>       {       
>               freeBuffer(&m_buffer);
>               freeBuffer(&m_buffer2);
>               freeBuffer(&m_body);
>       }
> /// destructor
>       virtual ~APSAPISoap(void);
> };
> #endif                          /* APSAPISOAP_H */

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to