Possible improvements to the HTTPTransport::getHTTPHeaders() and the HTTPTransport::flushOutput() methods - HTTPTransport.cpp file -----------------------------------------------------------------------------------------------------------------------------------
Key: AXISCPP-822 URL: http://issues.apache.org/jira/browse/AXISCPP-822 Project: Axis-C++ Type: Improvement Components: Transport (axis3) Versions: current (nightly) Reporter: Denis Linine Priority: Trivial 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 -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira