[ https://issues.apache.org/jira/browse/AXISCPP-1043?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
nadir amra reopened AXISCPP-1043: --------------------------------- Investigating...I think there is a problem. > Error handling several HTTP headers in one response > --------------------------------------------------- > > Key: AXISCPP-1043 > URL: https://issues.apache.org/jira/browse/AXISCPP-1043 > Project: Axis-C++ > Issue Type: Bug > Components: Transport (axis3) > Affects Versions: current (nightly) > Environment: MS Windows XP + MS ISA Proxy server + IIS > Reporter: Michail Ushakov > Assignee: nadir amra > Fix For: current (nightly) > > > HTTPTransport can not properly handle several HTTP headers in one server > response. > Error in HTTPTransport.cpp in void HTTPTransport::readHTTPHeader() method: > void HTTPTransport::readHTTPHeader() > { > m_pActiveChannel->closeQuietly( false); > > // The parser is expecting a SOAP message. Thus, the HTTP header must > have > // been read and processed before control is returned to the parser. It > can > // not be assumed that the HTTP header will be read in one block, thus > there > // must be processing that first identifies the beginning of the HTTP > header > // block (i.e. looks for 'HTTP') and then additional processing that > identifies > // the end of the HTTP header block (i.e. looks for CR LF CR LF). > // Note that for HTTP 100 responses, we consume it and restart the > process. > int numberOfBytesRead; > string::size_type iHTTPStart; > string::size_type iHTTPEnd; > > > do > { > resetInputStateMachine(); // <--- here > while (m_strReceived.find( ASCII_S_HTTP) == std::string::npos > || m_strReceived.find( ASCII_S_CRLFCRLF) == std::string::npos) > { > numberOfBytesRead = m_pActiveChannel->readBytes(m_pszRxBuffer, > BUF_SIZE); > > if (numberOfBytesRead > 0) > { > m_strReceived += m_pszRxBuffer; > m_iBytesLeft = m_strReceived.length(); > } > else > { > m_bReopenConnection = true; > throw HTTPTransportException( > SERVER_TRANSPORT_INPUT_STREAMING_ERROR, > "Socket connection has been > closed."); > } > } > > // At this point the HTTP header has been found. Seperate the > response headers > // from the payload (i.e. SOAP message). > iHTTPStart = m_strReceived.find( ASCII_S_HTTP); > iHTTPEnd = m_strReceived.find( ASCII_S_CRLFCRLF, iHTTPStart); > > m_strResponseHTTPHeaders = m_strReceived.substr( iHTTPStart, > iHTTPEnd + 4 - iHTTPStart); > // Process the HTTP header > processHTTPHeader(); > } > while( m_iResponseHTTPStatusCode == 100); > // rest of code > Proposed resolution: > void HTTPTransport::readHTTPHeader() > { > m_pActiveChannel->closeQuietly( false); > > // The parser is expecting a SOAP message. Thus, the HTTP header must > have > // been read and processed before control is returned to the parser. It > can > // not be assumed that the HTTP header will be read in one block, thus > there > // must be processing that first identifies the beginning of the HTTP > header > // block (i.e. looks for 'HTTP') and then additional processing that > identifies > // the end of the HTTP header block (i.e. looks for CR LF CR LF). > // Note that for HTTP 100 responses, we consume it and restart the > process. > int numberOfBytesRead; > string::size_type iHTTPStart; > string::size_type iHTTPEnd; > > // Initialize our state > resetInputStateMachine(); //!!! note > > do > { > while (m_strReceived.find( ASCII_S_HTTP) == std::string::npos > || m_strReceived.find( ASCII_S_CRLFCRLF) == std::string::npos) > { > numberOfBytesRead = m_pActiveChannel->readBytes(m_pszRxBuffer, > BUF_SIZE); > > if (numberOfBytesRead > 0) > { > m_strReceived += m_pszRxBuffer; > m_iBytesLeft = m_strReceived.length(); > } > else > { > m_bReopenConnection = true; > throw HTTPTransportException( > SERVER_TRANSPORT_INPUT_STREAMING_ERROR, > "Socket connection has been > closed."); > } > } > > // At this point the HTTP header has been found. Seperate the > response headers > // from the payload (i.e. SOAP message). > iHTTPStart = m_strReceived.find( ASCII_S_HTTP); > iHTTPEnd = m_strReceived.find( ASCII_S_CRLFCRLF, iHTTPStart); > > m_strResponseHTTPHeaders = m_strReceived.substr( iHTTPStart, > iHTTPEnd + 4 - iHTTPStart); > // Process the HTTP header > processHTTPHeader(); > // trunk header and try get another > // I`m not sure that all needed info stored > m_strReceived = m_strReceived.substr(iHTTPEnd + 4); // > } > while( m_iResponseHTTPStatusCode == 100); -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]