Uploaded image for project: 'Axis-C++'
  1. Axis-C++
  2. AXISCPP-822

Possible improvements to the HTTPTransport::getHTTPHeaders() and the HTTPTransport::flushOutput() methods - HTTPTransport.cpp file

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Trivial
    • Resolution: Fixed
    • current (nightly)
    • 1.6 Alpha
    • Transport (axis3)
    • None

    Description

      Hello,

      HTTPTransport::flushOutput() could be written like this (some current code is commented out):

      AXIS_TRANSPORT_STATUS HTTPTransport::flushOutput() throw (AxisException, HTTPTransportException)
      {
      // 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
      // messages as the length of the encoded message is not necessarily the
      // same as the length of the uncoded message.

      // char buff[8]; // theoretically, a 8-char-long buffer can be too small even for 32 bit systems
      char buff[24];

      //sprintf( buff, "%d", m_strBytesToSend.length ());
      //this->setTransportProperty ("Content-Length", buff);

      // two lines above can be replaced like this (ultoa should work faster than sprintf):
      setTransportProperty ("Content-Length", ultoa(m_strBytesToSend.length (), buff, 10));

      // The header is now complete. The message header and message can now be
      // transmitted.

      // utf8Buf will leak if an exception is thrown, catching different types of exceptions just to rethrow them is excessive

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

      char *utf8Buf = NULL;

      try

      { #ifndef __OS400__ *m_pActiveChannel << getHTTPHeaders (); *m_pActiveChannel << m_strBytesToSend.c_str (); #else const char *buf = this->getHTTPHeaders (); utf8Buf = toUTF8((char *)buf, strlen(buf)+1); *m_pActiveChannel << utf8Buf; free(utf8Buf); utf8Buf = NULL; // 5 lines above could probably be rewritten like this: // getHTTPHeaders(); // utf8Buf = toUTF8(m_strHeaderBytesToSend.c_str(), m_strHeaderBytesToSend.length()+1); // eliminate strlen; is const_cast<char*>(m_strBytesToSend.c_str()) necessary (what type of the toUTF8 first parameter)? // free(utf8Buf); // utf8Buf = NULL; buf = m_strBytesToSend.c_str(); utf8Buf = toUTF8(m_strBytesToSend.c_str(), m_strBytesToSend.length()+1); // eliminate strlen; is const_cast<char*>(m_strBytesToSend.c_str()) necessary (what type of the toUTF8 first parameter)? *m_pActiveChannel << utf8Buf; free(utf8Buf); utf8Buf = NULL; #endif }

      catch(...)

      { free(utf8Buf); // might be one should empty strings? // m_strBytesToSend.clear(); // m_strHeaderBytesToSend.clear(); throw; }

      // m_strHeaderBytesToSend seem to be used only by this function.
      // Is it not possible to make them local variables for flushOutput() and pass

      // Empty the bytes to send string.
      //m_strBytesToSend = "";
      //m_strHeaderBytesToSend = "";
      m_strBytesToSend.clear(); // ?
      m_strHeaderBytesToSend.clear(); // ?

      return TRANSPORT_FINISHED;
      }

      The first lines of the HTTPTransport::getHTTPHeaders():

      const char * HTTPTransport::getHTTPHeaders()
      {
      URL & url = m_pActiveChannel->getURLObject();
      unsigned short uiPort = url.getPort();
      char buff[8];

      m_strHeaderBytesToSend = m_strHTTPMethod + " ";
      if (m_bUseProxy)
      m_strHeaderBytesToSend += std::string (url.getURL ()) + " ";
      else
      m_strHeaderBytesToSend += std::string (url.getResource ()) + " ";
      m_strHeaderBytesToSend += m_strHTTPProtocol + "\r\n";

      if (m_bUseProxy)
      m_strHeaderBytesToSend += std::string ("Host: ") + m_strProxyHost;
      else
      m_strHeaderBytesToSend += std::string ("Host: ") + url.getHostName ();

      if (m_bUseProxy)
      uiPort = m_uiProxyPort;

      sprintf (buff, "%u", uiPort);

      m_strHeaderBytesToSend += ":";
      m_strHeaderBytesToSend += buff;
      m_strHeaderBytesToSend += "\r\n";

      could probably be rewritten this way (eliminate creation of temporary strings, eliminate excessive if/else):

      const char * HTTPTransport::getHTTPHeaders()
      {
      URL & url = m_pActiveChannel->getURLObject();
      unsigned short uiPort;
      // char buff[8]; // theoretically, a 8-char-long buffer can be too small even for 32 bit systems
      char buff[32];

      m_strHeaderBytesToSend = m_strHTTPMethod + " ";
      if (m_bUseProxy)

      { m_strHeaderBytesToSend += url.getURL (); m_strHeaderBytesToSend += " "; m_strHeaderBytesToSend += m_strHTTPProtocol; m_strHeaderBytesToSend += "\r\nHost: "; m_strHeaderBytesToSend += m_strProxyHost; uiPort = m_uiProxyPort; }

      else

      { m_strHeaderBytesToSend += url.getResource (); m_strHeaderBytesToSend += " "; m_strHeaderBytesToSend += m_strHTTPProtocol; m_strHeaderBytesToSend += "\r\nHost: "; m_strHeaderBytesToSend += url.getHostName (); uiPort = url.getPort(); }

      sprintf(buff, ":%u\r\n", uiPort);
      m_strHeaderBytesToSend += buff;

      Note please that this code was nether tested nor even compiled

      Attachments

        Activity

          People

            nadiramra Nadir K. Amra
            den Denis Linine
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: