You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by "nadir amra (JIRA)" <ax...@ws.apache.org> on 2005/10/21 01:22:44 UTC

[jira] Assigned: (AXISCPP-822) Possible improvements to the HTTPTransport::getHTTPHeaders() and the HTTPTransport::flushOutput() methods - HTTPTransport.cpp file

     [ http://issues.apache.org/jira/browse/AXISCPP-822?page=all ]

nadir amra reassigned AXISCPP-822:
----------------------------------

    Assign To: nadir amra

> 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
>     Assignee: nadir amra
>     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