You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by na...@apache.org on 2007/04/21 20:58:08 UTC
svn commit: r531086 - /webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp
Author: nadiramra
Date: Sat Apr 21 11:58:07 2007
New Revision: 531086
URL: http://svn.apache.org/viewvc?view=rev&rev=531086
Log:
AXISCPP-1029 - A non SOAP response results in client crashing.
Modified:
webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp
Modified: webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp
URL: http://svn.apache.org/viewvc/webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp?view=diff&rev=531086&r1=531085&r2=531086
==============================================================================
--- webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp (original)
+++ webservices/axis/trunk/c/src/soap/SoapDeSerializer.cpp Sat Apr 21 11:58:07 2007
@@ -68,6 +68,7 @@
m_pNode = NULL;
m_pInputStream = NULL;
m_nStatus = AXIS_SUCCESS;
+ m_nSoapVersion = VERSION_LAST;
}
SoapDeSerializer::
@@ -178,48 +179,54 @@
SoapEnvelope *SoapDeSerializer::
getEnvelope ()
{
- Attribute * pAttr = NULL;
-
- if ((AXIS_FAIL == getNextNode(true)) || (START_ELEMENT != m_pNode->m_type))
+ if (AXIS_FAIL == getNextNode(true))
return NULL;
-
- if (0 == strcmp (m_pNode->m_pchNameOrValue,
- SoapKeywordMapping::map (SOAP_VER_1_2).pchWords[SKW_ENVELOPE]))
+
+ // Better be a start-element.
+ if (START_ELEMENT != m_pNode->m_type)
{
- // No try/catch block needed here since we already have the node
- SoapEnvelope *m_pEnvl = new SoapEnvelope ();
-
- // set all attributes of SoapEnvelope
- std::list<Attribute*> attributeList0;
- pAttr = new Attribute ( attributeList0);
-
- pAttr->setValue (m_pNode->m_pchNamespace);
- m_pEnvl->addNamespaceDecl (pAttr);
-
- if (0 == strcmp (m_pNode->m_pchNamespace, SoapKeywordMapping::map (SOAP_VER_1_1).pchNamespaceUri))
- m_nSoapVersion = SOAP_VER_1_1;
- else if (0 == strcmp (m_pNode->m_pchNamespace, SoapKeywordMapping::map (SOAP_VER_1_2).pchNamespaceUri))
- m_nSoapVersion = SOAP_VER_1_2;
- else
- m_nSoapVersion = VERSION_LAST;
+ m_nStatus = AXIS_FAIL;
+ throw AxisSoapException (CLIENT_SOAP_SOAP_CONTENT_ERROR, "Start-element for SOAP Envelope not found.");
+ }
+
+ // We are expecting a SOAP envelope.
+ if (0 != strcmp(m_pNode->m_pchNameOrValue,SoapKeywordMapping::map(SOAP_VER_1_2).pchWords[SKW_ENVELOPE]))
+ {
+ m_nStatus = AXIS_FAIL;
+ throw AxisSoapException (CLIENT_SOAP_SOAP_CONTENT_ERROR, "Element is not a SOAP Envelope.");
+ }
+
+ // No try/catch block needed here since we already have the node
+ SoapEnvelope *m_pEnvl = new SoapEnvelope ();
+
+ // set all attributes of SoapEnvelope
+ std::list<Attribute*> attributeList0;
+ Attribute * pAttr = new Attribute ( attributeList0);
- // Set Attributes
- for (int i = 0; m_pNode->m_pchAttributes[i]; i += 3)
- {
- std::list<Attribute*> attributeList1;
- pAttr = new Attribute (attributeList1);
- pAttr->setLocalName (m_pNode->m_pchAttributes[i]);
- pAttr->setURI (m_pNode->m_pchAttributes[i + 1]);
- pAttr->setValue (m_pNode->m_pchAttributes[i + 2]);
- m_pEnvl->addAttribute (pAttr);
- }
+ pAttr->setValue (m_pNode->m_pchNamespace);
+ m_pEnvl->addNamespaceDecl (pAttr);
- // indicate node consumed and return envelope
- m_pNode = NULL;
- return m_pEnvl;
+ if (0 == strcmp (m_pNode->m_pchNamespace, SoapKeywordMapping::map (SOAP_VER_1_1).pchNamespaceUri))
+ m_nSoapVersion = SOAP_VER_1_1;
+ else if (0 == strcmp (m_pNode->m_pchNamespace, SoapKeywordMapping::map (SOAP_VER_1_2).pchNamespaceUri))
+ m_nSoapVersion = SOAP_VER_1_2;
+ else
+ m_nSoapVersion = VERSION_LAST;
+
+ // Set Attributes
+ for (int i = 0; m_pNode->m_pchAttributes[i]; i += 3)
+ {
+ std::list<Attribute*> attributeList1;
+ pAttr = new Attribute (attributeList1);
+ pAttr->setLocalName (m_pNode->m_pchAttributes[i]);
+ pAttr->setURI (m_pNode->m_pchAttributes[i + 1]);
+ pAttr->setValue (m_pNode->m_pchAttributes[i + 2]);
+ m_pEnvl->addAttribute (pAttr);
}
- return NULL;
+ // indicate node consumed and return envelope
+ m_pNode = NULL;
+ return m_pEnvl;
}
/*
@@ -247,9 +254,10 @@
if (AXIS_FAIL == getNextNode())
return m_nStatus;
- if ((START_ELEMENT == m_pNode->m_type) &&
- (0 == strcmp (m_pNode->m_pchNameOrValue,
- SoapKeywordMapping::map (m_nSoapVersion).pchWords[SKW_HEADER])))
+ if ((START_ELEMENT == m_pNode->m_type)
+ && (m_nSoapVersion != VERSION_LAST)
+ && (0 == strcmp (m_pNode->m_pchNameOrValue,
+ SoapKeywordMapping::map (m_nSoapVersion).pchWords[SKW_HEADER])))
{
delete m_pHeader;
m_pHeader = new SoapHeader ();
@@ -388,8 +396,10 @@
return m_nStatus;
// previous header searching may have left a node unidentified
- if ((START_ELEMENT == m_pNode->m_type) &&
- (0 == strcmp (m_pNode->m_pchNameOrValue,SoapKeywordMapping::map (m_nSoapVersion).pchWords[SKW_BODY])))
+ if ((START_ELEMENT == m_pNode->m_type)
+ && (m_nSoapVersion != VERSION_LAST)
+ && (0 == strcmp (m_pNode->m_pchNameOrValue,
+ SoapKeywordMapping::map (m_nSoapVersion).pchWords[SKW_BODY])))
{
// indicate node consumed
m_pNode = NULL;
@@ -561,6 +571,7 @@
if (VERSION_LAST == m_nSoapVersion)
{
delete m_pEnv;
+ m_pEnv = NULL;
m_pEnv = getEnvelope ();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org