Details
-
Improvement
-
Status: Closed
-
Trivial
-
Resolution: Fixed
-
current (nightly)
-
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
//
// catch( HTTPTransportException & e)
//
// catch( AxisException & e)
// {// throw;// }
// catch(...)
//
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)
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