cdinapala    2005/08/22 20:23:32

  Modified:    c/src/transport/axis3 HTTPTransport.cpp IChannel.hpp
  Log:
  I have done some modifications as suggest in issue AXISCPP-558.
  With changes build and tests are working fine.
  
  Revision  Changes    Path
  1.39      +89 -27    ws-axis/c/src/transport/axis3/HTTPTransport.cpp
  
  Index: HTTPTransport.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/transport/axis3/HTTPTransport.cpp,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- HTTPTransport.cpp 8 Aug 2005 09:40:15 -0000       1.38
  +++ HTTPTransport.cpp 23 Aug 2005 03:23:32 -0000      1.39
  @@ -285,6 +285,25 @@
    */
   AXIS_TRANSPORT_STATUS HTTPTransport::flushOutput() throw (AxisException, 
HTTPTransportException)
   {
  +     //Chinthana:AXISCPP-558 - Gracefully handle server side close of 
persistant connection
  +     if( m_bReopenConnection)
  +     {
  +             m_bReopenConnection = false;
  +  
  +             if( m_pActiveChannel->open() != AXIS_SUCCESS)
  +             {
  +                 int                         iStringLength = 
m_pActiveChannel->GetLastErrorMsg().length() + 1;
  +                     const char *    pszLastError = new char[iStringLength];
  +  
  +                 memcpy( (void *) pszLastError,
  +                                     
m_pActiveChannel->GetLastErrorMsg().c_str(),
  +                                     iStringLength);
  +  
  +                 throw HTTPTransportException( 
CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED,(char *) pszLastError);
  +             }
  +     }
  +     //16-08-2005.................................................
  +     
       // In preperation for sending the message, calculate the size of the 
message
       // by using the string length method.
       // NB: This calculation may not necessarily be correct when dealing with 
SSL
  @@ -296,35 +315,78 @@
   
       this->setTransportProperty ("Content-Length", buff);
   
  +     //Chinthana:AXISCPP-558 - Gracefully handle server side close of 
persistant connection
  +     bool reopenConnection;
  +     if (m_pActiveChannel->reopenRequired())
  +     {
  +             reopenConnection = true;
  +     }
  +     else 
  +     {
  +             reopenConnection = m_bReopenConnection;
  +             m_bReopenConnection = false;
  +     }
  + 
  +     bool reopenConnectionOnFailure = true;
  +     bool dataSent = false;
  + 
  +     while (!dataSent) 
  +     {
  +             if( reopenConnection ) 
  +             {
  +                     m_pActiveChannel->close();
  + 
  +                     if( m_pActiveChannel->open() != AXIS_SUCCESS)
  +                     {
  +                             int iStringLength = 
m_pActiveChannel->GetLastErrorMsg().length() + 1;
  +                             const char* pszLastError = new 
char[iStringLength];
  + 
  +                             memcpy( (void *) pszLastError,
  +                                     
m_pActiveChannel->GetLastErrorMsg().c_str(),
  +                                     iStringLength);
  +  
  +                             throw HTTPTransportException( 
CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED,
  +                                                           (char *) 
pszLastError);
  +                     }
  +  
  +                     // Only attempt to reopen the connection one time
  +                     reopenConnectionOnFailure = false;
  +             }
  +     //16-08-2005.................................................
  +
       // The header is now complete.  The message header and message can now be
       // transmitted.
  -     try
  -     {
  -#ifndef __OS400__
  -             *m_pActiveChannel << this->getHTTPHeaders ();
  -             *m_pActiveChannel << this->m_strBytesToSend.c_str ();
  -#else                
  -        const char *buf = this->getHTTPHeaders ();
  -        char *utf8Buf = toUTF8((char *)buf, strlen(buf)+1);
  -             *m_pActiveChannel << utf8Buf;
  -        free(utf8Buf);
  -        buf     = this->m_strBytesToSend.c_str();
  -        utf8Buf = toUTF8((char *)buf, strlen(buf)+1);
  -             *m_pActiveChannel << utf8Buf;
  -        free(utf8Buf);
  -#endif
  -     }
  -     catch( HTTPTransportException & e)
  -     {
  -             throw;
  -     }
  -     catch( AxisException & e)
  -     {
  -             throw;
  -     }
  -     catch(...)
  -     {
  -             throw;
  +             try
  +             {
  +                     #ifndef __OS400__
  +                                     *m_pActiveChannel << 
this->getHTTPHeaders ();
  +                                     *m_pActiveChannel << 
this->m_strBytesToSend.c_str ();
  +                     #else           
  +                                     const char *buf = this->getHTTPHeaders 
();
  +                                     char *utf8Buf = toUTF8((char *)buf, 
strlen(buf)+1);
  +                                     *m_pActiveChannel << utf8Buf;
  +                                     free(utf8Buf);
  +                                     buf     = 
this->m_strBytesToSend.c_str();
  +                                     utf8Buf = toUTF8((char *)buf, 
strlen(buf)+1);
  +                                     *m_pActiveChannel << utf8Buf;
  +                                     free(utf8Buf);
  +                     #endif
  +                     // Chinthana: We're done sending
  +                     dataSent = true;
  +
  +             }
  +             catch( HTTPTransportException & e)
  +             {
  +                     throw;
  +             }
  +             catch( AxisException & e)
  +             {
  +                     throw;
  +             }
  +             catch(...)
  +             {
  +                     throw;
  +             }
        }
   
       // Empty the bytes to send string.
  
  
  
  1.8       +1 -0      ws-axis/c/src/transport/axis3/IChannel.hpp
  
  Index: IChannel.hpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/transport/axis3/IChannel.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- IChannel.hpp      23 Mar 2005 15:45:02 -0000      1.7
  +++ IChannel.hpp      23 Aug 2005 03:23:32 -0000      1.8
  @@ -51,6 +51,7 @@
        virtual bool                            setTransportProperty( 
AXIS_TRANSPORT_INFORMATION_TYPE type, const char* value)=0;
        virtual const char *            getTransportProperty( 
AXIS_TRANSPORT_INFORMATION_TYPE type)=0;
        virtual void                setProxy(const char *pcProxyHost,unsigned 
int uiProxyPort) = 0;
  +     virtual bool                            reopenRequired() throw() = 0;
   };
   
   #endif
  
  
  

Reply via email to