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 da...@apache.org on 2004/01/06 08:46:40 UTC
cvs commit: ws-axis/c/src/soap SoapBinInputStream.cpp
damitha 2004/01/05 23:46:40
Modified: c/docs/linux Tag: Release-2003_10_26-bugfixes_branch
lininstall-guide.html
c/include/axis/client/transport Tag:
Release-2003_10_26-bugfixes_branch AxisTransport.h
c/include/axis/client/transport/axis Tag:
Release-2003_10_26-bugfixes_branch Channel.hpp
HttpTransport.hpp Receiver.hpp Transport.hpp
c/include/axis/common Tag:
Release-2003_10_26-bugfixes_branch AxisTrace.h
AxisUserAPI.h
c/samples/client/interoptests/base Tag:
Release-2003_10_26-bugfixes_branch
InteropBaseClient.cpp
c/src/client/transport/axis Tag:
Release-2003_10_26-bugfixes_branch
AxisTransport.cpp Channel.cpp HttpTransport.cpp
Receiver.cpp Transport.cpp
c/src/soap Tag: Release-2003_10_26-bugfixes_branch
SoapBinInputStream.cpp
Log:
Did some major changes to client side transport layer. Earlier in Channel.cpp, socket method
recv is called in a do while loop and the received buffer is accumulated into a string which is
passed into the parser in full. This model fails sadly for large array size in echoStringArray method of interopbase/base sample. The change I made is to pass the buffer received from recv method without accumulating into the parser.
Revision Changes Path
No revision
No revision
1.1.2.3 +12 -11 ws-axis/c/docs/linux/Attic/lininstall-guide.html
Index: lininstall-guide.html
===================================================================
RCS file: /home/cvs/ws-axis/c/docs/linux/Attic/lininstall-guide.html,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- lininstall-guide.html 30 Nov 2003 10:41:36 -0000 1.1.2.2
+++ lininstall-guide.html 6 Jan 2004 07:46:39 -0000 1.1.2.3
@@ -339,20 +339,21 @@
</div>
<p>We tested with the following</p>
<ul>
-<li>Redhat Linux 8.0(2.4.18-14), RedhatLinux9.0(2.4.20-8), mandrake8.0(2.4.8-26) </li>
-<li>Apache 1.3 [apache_1.3.27.tar .gz, apache_1.3.28.tar.gz)], (Source), apache2.0 (source)</li>
+<li>Redhat Linux 8.0(2.4.18-14), RedhatLinux9.0(2.4.20-8), Mandrake8.0(2.4.8-26) </li>
+<li>Apache 1.3 [apache_1.3.27.tar .gz, apache_1.3.28.tar.gz)], (Source), Apache2.0 (source)</li>
<li>Xerces C++ [xerces-c-src2_2_0.tar.gz](Source) >(Source)</li>
</ul>
<p>
-<strong>Getting the source or binary from the mirror site and setting the environment variables</strong>
+<strong>Downloading the source or binary from the mirror site and setting the environment variables</strong>
</p>
-<p>User can download the Axis C++ source or binary from one of the apache mirror sites</p>
-<p>Your downloaded distribution is axis-c-src-beta-linux.tar.gz. After you extracting it for example as, <strong>/home/axisuser/projects/axis-c-src-beta-linux</strong> you can rename it as <strong>axis_c</strong>
+<p>You can download the Axis C++ source or binary from one of the apache mirror sites
+<a href="http://ws.apache.org/axis/cpp/download.html">http://ws.apache.org/axis/cpp/download.html</a></p>
+<p>Your downloaded distribution is axis-c-src-1_0-linux.tar.gz. After you extracting it for example as, <strong>/home/axisuser/projects/axis-c-src-1_0-linux</strong> you can rename it as <strong>axis_c</strong>
</p>
-<p>The directory where you extracted the tar ball will be called <axiscpphome> from now on. We further assume that the user dose the installation and has the linux user account axisuser. For example I have my <axiscpphome> as following.</p>
-<p>/home/axisuser/projects</p>
+<p>You have to set the environment variable $AXISCPP_HOME to the directory where you extracted the tar ball. We further assume that the user dose the installation and has the linux user account axisuser. For example I have my <AXISCPP_HOME> as following.</p>
+<p>/home/axisuser/projects/axis_c</p>
<p>
<a name="Installing"></a>
</p>
@@ -374,7 +375,7 @@
<strong>$ ./configure --enable-module=so</strong>
</p>
-<p>Note:- Here "so" are simple letters</p>
+<p>Note:- Here "so" is simple letters</p>
<p>
<strong>$ make</strong>
</p>
@@ -487,7 +488,7 @@
<p>
-----------------------------------------------------------------
</p>
-<p>Now libaxiscpp_mod.so (in apache2 this is libaxiscpp_mod2.so) should have been created in $AXISCPP_HOME/bin directory. Note:- you can give the install path inside the runconfigure script.There will be link errors if you don't use correct version of xerces-c.</p>
+<p>Now libaxiscpp_mod.so (If you built for apache2 this is libaxiscpp_mod2.so) should have been created in $AXISCPP_HOME/bin directory. Note:- you can give the install path inside the runconfigure script.There will be link errors if you don't use correct version of xerces-c.</p>
<p>Now you need to edit /usr/local/apache/conf/httpd.conf</p>
<p>
<strong>$ vi /usr/local/apache/conf/httpd.conf</strong>
@@ -506,9 +507,9 @@
<p>
<strong></Location></strong>
</p>
-<p>Copy /home/axisuser/projects/axis_c/bin/libaxiscpp_mod.so into /usr/local/Apache/libexec/ (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</p>
+<p>Copy $AXISCPP_HOME/bin/libaxiscpp_mod.so into /usr/local/Apache/libexec/ (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</p>
<p>
-<strong>$cp -f /home/axisuser/projects/axis_c/bin/libaxiscpp_mod.so /usr/local/apache/libexec (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</strong>
+<strong>$cp -f $AXISCPP_HOME/bin/libaxiscpp_mod.so /usr/local/apache/libexec (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</strong>
</p>
<p>Restart apache</p>
No revision
No revision
1.2.2.2 +1 -1 ws-axis/c/include/axis/client/transport/AxisTransport.h
Index: AxisTransport.h
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/client/transport/AxisTransport.h,v
retrieving revision 1.2.2.1
retrieving revision 1.2.2.2
diff -u -r1.2.2.1 -r1.2.2.2
--- AxisTransport.h 27 Nov 2003 12:59:43 -0000 1.2.2.1
+++ AxisTransport.h 6 Jan 2004 07:46:39 -0000 1.2.2.2
@@ -67,7 +67,7 @@
@brief api for the client transport layer
- @author Damitha Kumarage (damitha@opensource.lk)
+ @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
@author Susantha Kumara (susantha@opensource.lk, skumara@virtusa.com)
*/
class AxisTransport
No revision
No revision
1.2.2.2 +2 -2 ws-axis/c/include/axis/client/transport/axis/Channel.hpp
Index: Channel.hpp
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/client/transport/axis/Channel.hpp,v
retrieving revision 1.2.2.1
retrieving revision 1.2.2.2
diff -u -r1.2.2.1 -r1.2.2.2
--- Channel.hpp 5 Jan 2004 04:42:45 -0000 1.2.2.1
+++ Channel.hpp 6 Jan 2004 07:46:39 -0000 1.2.2.2
@@ -59,6 +59,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -68,7 +69,6 @@
#include <string>
#include "Transport.hpp"
-#define AXIS_TRANSPORT_BUF_SIZE 512
// platform specific stuff
#ifdef WIN32
@@ -175,8 +175,8 @@
std::string m_RemoteNode; ///< Remote address could be IP/host-name
unsigned short m_RemoteEnd; ///< Remote port number
std::string m_LastErr; ///< Last error as a string
+
Transport * m_pTransportHandler; ///< Transport handler for validation purpose
- static char m_buf[AXIS_TRANSPORT_BUF_SIZE]; //Assuming this transport is used only by a single thread.
};
1.2.2.3 +10 -2 ws-axis/c/include/axis/client/transport/axis/HttpTransport.hpp
Index: HttpTransport.hpp
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/client/transport/axis/HttpTransport.hpp,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -r1.2.2.2 -r1.2.2.3
--- HttpTransport.hpp 1 Jan 2004 12:15:15 -0000 1.2.2.2
+++ HttpTransport.hpp 6 Jan 2004 07:46:39 -0000 1.2.2.3
@@ -59,6 +59,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -91,10 +92,10 @@
enum Type{POST, MPOST};
/// Create HTTP transport with provided URL as remote address, set HTTP category default to POST
- HttpTransport(Url url) : m_Typ(POST) {m_Url = url; m_Length = 0;}
+ HttpTransport(Url url) : m_Typ(POST) {m_Url = url; m_IsHttpHeader = 0;}
/// Create HTTP transport with provided remote address as URL-string, set HTTP category default to POST
- HttpTransport(std::string& strUrl) : m_Typ(POST) {m_Url = Url(strUrl); m_strUrl = strUrl; m_Length = 0;}
+ HttpTransport(std::string& strUrl) : m_Typ(POST) {m_Url = Url(strUrl); m_strUrl = strUrl; m_IsHttpHeader = 0;}
~HttpTransport();
/// Initialize HTTP transport by establishing a channel to the remote end.
@@ -114,6 +115,9 @@
/// Write a given payload by using HTTP transport as carrier
const Transport& operator << (const std::string& p_Payload);
+ int getBodyLength();
+ void setBodyLength(int bodyLength);
+ int getIsHttpHeader();
private:
/// Build a HTTP packet with a given payload & additional HTTP properties
@@ -139,9 +143,13 @@
std::ostringstream m_OutMsg; ///< Holds outgoing HTTP packet
std::istringstream m_InMsg; ///< Holds incoming HTTP packet
+ std::string m_PayLoad; ///< Holds the payload
Header_t m_AdditionalHeader; ///< Additional Header fields as name value pairs
private:
Channel m_Channel;
+ int m_IsHttpHeader;
+ std::string m_sHeader;
+ int m_intBodyLength;
};
#endif //_AXIS_HTTPTRANSPORT_HPP
1.2.2.2 +2 -0 ws-axis/c/include/axis/client/transport/axis/Receiver.hpp
Index: Receiver.hpp
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/client/transport/axis/Receiver.hpp,v
retrieving revision 1.2.2.1
retrieving revision 1.2.2.2
diff -u -r1.2.2.1 -r1.2.2.2
--- Receiver.hpp 12 Dec 2003 13:49:19 -0000 1.2.2.1
+++ Receiver.hpp 6 Jan 2004 07:46:39 -0000 1.2.2.2
@@ -59,6 +59,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -77,6 +78,7 @@
~Receiver();
const char* Recv(int nMaxToRead) throw (AxisException);
+ int getBytesRead();
private:
const char* m_pMsg;
1.2.2.3 +7 -4 ws-axis/c/include/axis/client/transport/axis/Transport.hpp
Index: Transport.hpp
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/client/transport/axis/Transport.hpp,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -r1.2.2.2 -r1.2.2.3
--- Transport.hpp 1 Jan 2004 12:15:15 -0000 1.2.2.2
+++ Transport.hpp 6 Jan 2004 07:46:39 -0000 1.2.2.3
@@ -59,6 +59,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -93,16 +94,18 @@
virtual const Transport& operator >> (const char** pMsg){*pMsg=NULL;return *this;}
virtual const Transport& operator << (const std::string& msg){return *this;}
- virtual void ClearAdditionalHeaders(){};
+ virtual void ClearAdditionalHeaders(){};
+ virtual int getBodyLength() = 0;
+ virtual void setBodyLength(int bodyLength) = 0;
+ virtual int getIsHttpHeader() = 0;
protected:
+
Url m_Url;
std::string m_strUrl;
bool m_bStatus;
-public:
- int m_Length;
- std::string m_PayLoad; ///< Holds the payload
+
};
#endif // _AXIS_TRANSPORT_HPP
No revision
No revision
1.4.2.8 +1 -1 ws-axis/c/include/axis/common/AxisTrace.h
Index: AxisTrace.h
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/common/AxisTrace.h,v
retrieving revision 1.4.2.7
retrieving revision 1.4.2.8
diff -u -r1.4.2.7 -r1.4.2.8
--- AxisTrace.h 17 Dec 2003 05:56:55 -0000 1.4.2.7
+++ AxisTrace.h 6 Jan 2004 07:46:40 -0000 1.4.2.8
@@ -64,7 +64,7 @@
#include <string>
#include <stdio.h>
-//#define __AXISTRACE__
+#define __AXISTRACE__
#if defined(__AXISTRACE__)
#define AXISTRACE1(X, Y) g_pAT->logaxis(X,Y,__FILE__,__LINE__);
#define AXISTRACE2(X,Y, Z) g_pAT->logaxis(X,Y,Z,__FILE__,__LINE__);
1.2.2.3 +1 -1 ws-axis/c/include/axis/common/AxisUserAPI.h
Index: AxisUserAPI.h
===================================================================
RCS file: /home/cvs/ws-axis/c/include/axis/common/AxisUserAPI.h,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -r1.2.2.2 -r1.2.2.3
--- AxisUserAPI.h 28 Nov 2003 09:46:03 -0000 1.2.2.2
+++ AxisUserAPI.h 6 Jan 2004 07:46:40 -0000 1.2.2.3
@@ -70,7 +70,7 @@
int m_Size;
} Axis_Array;
-typedef struct tm Axis_Time;
+//typedef struct tm Axis_Time;
typedef struct tm Axis_Date;
typedef struct tm Axis_DateTime;
typedef double Axis_Decimal;
No revision
No revision
1.1.2.2 +12 -5 ws-axis/c/samples/client/interoptests/base/Attic/InteropBaseClient.cpp
Index: InteropBaseClient.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/samples/client/interoptests/base/Attic/InteropBaseClient.cpp,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- InteropBaseClient.cpp 28 Nov 2003 05:30:32 -0000 1.1.2.1
+++ InteropBaseClient.cpp 6 Jan 2004 07:46:40 -0000 1.1.2.2
@@ -19,9 +19,10 @@
printf("failed\n");
// testing echoStringArray
ArrayOfstring arrstr;
- arrstr.m_Array = new string[ARRAYSIZE];
- arrstr.m_Size = ARRAYSIZE;
- for (x=0;x<ARRAYSIZE;x++)
+ int temp = 3500;
+ arrstr.m_Array = new string[temp];
+ arrstr.m_Size = temp;
+ for (x=0;x<temp;x++)
{
sprintf(buffer, "%dth element of string array", x);
arrstr.m_Array[x] = buffer;
@@ -32,7 +33,7 @@
else
printf("failed\n");
// testing echoInteger
- printf("invoking echoInteger...\n");
+/* printf("invoking echoInteger...\n");
if (ws.echoInteger(56) == 56)
printf("successful\n");
else
@@ -109,9 +110,14 @@
printf("failed\n");
time_t tim;
time(&tim);
- tm* lt = gmtime(&tim);
+ //tm* lt = gmtime(&tim);
+ tm* lt = localtime(&tim);
printf("invoking echoDate...\n");
+ //tm lt2 = ws.echoDate(*lt);
+ //printf("year:%d\n", lt2.tm_year);
+ //printf("month:%d\n", lt2.tm_mon);
if (memcmp(&ws.echoDate(*lt), lt, sizeof(tm)) == 0)
+ //if(memcmp(<2, lt, sizeof(tm)) == 0)
printf("successful\n");
else
printf("failed\n");
@@ -134,6 +140,7 @@
printf("successful\n");
else
printf("failed\n");
+*/
getchar();
return 0;
}
No revision
No revision
1.9.2.4 +16 -11 ws-axis/c/src/client/transport/axis/AxisTransport.cpp
Index: AxisTransport.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/client/transport/axis/AxisTransport.cpp,v
retrieving revision 1.9.2.3
retrieving revision 1.9.2.4
diff -u -r1.9.2.3 -r1.9.2.4
--- AxisTransport.cpp 12 Dec 2003 13:49:20 -0000 1.9.2.3
+++ AxisTransport.cpp 6 Jan 2004 07:46:40 -0000 1.9.2.4
@@ -54,7 +54,7 @@
*/
/**
*
- * @author Damitha Kumarage (damitha@opensource.lk, damitha@jkcsworld.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
* @author Susantha Kumara (susantha@opensource.lk, skumara@virtusa.com)
*
*/
@@ -140,19 +140,23 @@
int AxisTransport::Get_bytes(char* pRecvBuffer, int nBuffSize, int* pRecvSize, const void* pStream)
{
- Receiver* pReceiver = (Receiver*) pStream;
- const char* strReceive = pReceiver->Recv(nBuffSize);
- int nLen;
- if (strReceive)
+ Receiver* pReceiver = (Receiver*) pStream;
+ const char* strReceive = pReceiver->Recv(nBuffSize);
+ int nLen;
+ if (strReceive)
{
+ //printf("strReceive:%s\n", strReceive);
nLen = strlen(strReceive);
nLen = (nLen < nBuffSize) ? nLen : nBuffSize;
- strncpy(pRecvBuffer, strReceive, nLen);
- *pRecvSize = nLen;
- return AXIS_SUCCESS;
- }
- else
- return AXIS_FAIL;
+ strncpy(pRecvBuffer, strReceive, nLen);
+ *pRecvSize = nLen;
+ //printf("nLen:%d\n", nLen);
+ return AXIS_SUCCESS;
+ }
+ else
+ {
+ return AXIS_FAIL;
+ }
}
@@ -179,3 +183,4 @@
{
return AXIS_SUCCESS;
}
+
1.2.2.4 +18 -50 ws-axis/c/src/client/transport/axis/Channel.cpp
Index: Channel.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/client/transport/axis/Channel.cpp,v
retrieving revision 1.2.2.3
retrieving revision 1.2.2.4
diff -u -r1.2.2.3 -r1.2.2.4
--- Channel.cpp 5 Jan 2004 04:42:45 -0000 1.2.2.3
+++ Channel.cpp 6 Jan 2004 07:46:40 -0000 1.2.2.4
@@ -59,6 +59,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -68,7 +69,6 @@
#include <axis/client/transport/axis/Transport.hpp>
using namespace std;
-char Channel::m_buf[AXIS_TRANSPORT_BUF_SIZE];
/**
* Create a Channel & initialize
*
@@ -99,13 +99,12 @@
{
m_RemoteNode = p_RemoteNode;
m_RemoteEnd = p_RemoteEnd;
-
+ //printf("open a new connection\n");
if(!Init())
throw ChannelException("Cannot initialize a channel to the remote end");
sockaddr_in clAddr, svAddr;
-
- if ((m_Sock = socket(PF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
+ if ((m_Sock = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
{
clAddr.sin_family = AF_INET; // AF_INET (address family Internet).
clAddr.sin_port = 0; // No Specify Port required
@@ -230,7 +229,7 @@
/**
* Read/receive a message from the remote server; reading may be done in chunks.
*
- * @param string to hold the read Message
+ * @param string to hold the read data chunk
*/
const Channel& Channel::operator >> (std::string& msg)
@@ -242,60 +241,29 @@
throw ChannelException("Input streaming error on undefined channel; please open the channel first");
}
- int nToRead;
int nByteRecv = 0;
-
- // read socket until we reach to the body
- do // Manage multiple chuncks of the message
- {
- if ((nByteRecv = recv(m_Sock, (char *) &m_buf, AXIS_TRANSPORT_BUF_SIZE - 1, 0)) == SOCKET_ERROR)
+ const int BUF_SIZE = 512;
+ char buf[BUF_SIZE];
+
+ if ((nByteRecv = recv(m_Sock, (char *) &buf, BUF_SIZE - 1, 0)) == SOCKET_ERROR)
{
+ perror("recv SOCKET_ERROR");
Error("Channel error while getting data.");
- CloseChannel();
- throw ChannelException("Input streaming error on Channel while getting data");
+ //CloseChannel();
+ return *this;
+ //throw ChannelException("Input streaming error on Channel while getting data");
}
-
if(nByteRecv)
{
- m_buf[nByteRecv] = '\0'; // got a part of the message, so add it to form
- msg += m_buf; // the whole message
-
+ //printf("if(nByteRecv)\n");
+ buf[nByteRecv] = '\0'; // got a part of the message, so add it to form
+ msg = buf;
+ //printf("buf:%s\n", buf);
}
else
- return *this;
-
- }
- while (msg.find("\r\n\r\n") == std::string::npos);
- if (!m_pTransportHandler->GetStatus(msg))
- {
- msg = "";
- return *this;
- }
-
- nToRead = m_pTransportHandler->m_Length - m_pTransportHandler->m_PayLoad.length();
-
- do // Manage multiple chuncks of the message
- {
- if ((nByteRecv = recv(m_Sock, (char *) &m_buf, AXIS_TRANSPORT_BUF_SIZE - 1, 0)) == SOCKET_ERROR)
- {
- Error("Channel error while getting data.");
- CloseChannel();
- throw ChannelException("Input streaming error on Channel while getting data");
- }
-
- if(nByteRecv)
- {
- nToRead -= nByteRecv;
- m_buf[nByteRecv] = '\0'; // got a part of the message, so add it to form
- m_pTransportHandler->m_PayLoad += m_buf; // the whole message
+ printf("execution break\n");
- }
- else
- break; // we have the whole message or an error has occured
- }
- while (nToRead > 0);
- //Validate according to the transport; check whether we are in a position to return.
- return *this;
+ return *this;
}
/**
1.7.2.3 +95 -29 ws-axis/c/src/client/transport/axis/HttpTransport.cpp
Index: HttpTransport.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/client/transport/axis/HttpTransport.cpp,v
retrieving revision 1.7.2.2
retrieving revision 1.7.2.3
diff -u -r1.7.2.2 -r1.7.2.3
--- HttpTransport.cpp 1 Jan 2004 12:15:16 -0000 1.7.2.2
+++ HttpTransport.cpp 6 Jan 2004 07:46:40 -0000 1.7.2.3
@@ -61,6 +61,7 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
@@ -141,21 +142,54 @@
// We have the payload; this is due to Fault request made in earlier call
// to this method
*pPayLoad = m_PayLoad.c_str();
+
return *this;
}
std::string tmpPacket; // use temporary, need to workout for this
- m_Channel >> tmpPacket;
+ if(m_IsHttpHeader == 1)
+ {
+ //printf("m_IsHttpHeader == 1\n");
+ m_Channel >> tmpPacket;
+ *pPayLoad = tmpPacket.c_str();
+
+ return *this;
+ }
+ //printf("tmpPacket:%s\n", tmpPacket.c_str());
#ifdef _DEBUG
std::cout << "\n\n\nGot the message:\r\n\r\n" << tmpPacket << "\n\n";
#endif
-
- // Validate the HTTP packet
- if(!m_bStatus) HTTPValidate(tmpPacket);
-
- // At this point we have the payload at hand so give it out
- *pPayLoad = m_PayLoad.c_str();
+ do //process will step into this only if http validation is not done. That is, until the stream
+ //contain the httpd header.
+ {
+ m_Channel >> tmpPacket;
+
+ // Validate the HTTP packet
+ if(m_IsHttpHeader == 1) //if header is validated but payload has zero length, process will steop into this.
+ {
+ //printf("while,m_IsHttpHeader == 1\n");
+ *pPayLoad = tmpPacket.c_str();
+
+ break;
+ }
+ //printf("do while\n");
+ if(m_bStatus) HTTPValidate(tmpPacket); //Validate the header
+ int j = strlen(tmpPacket.c_str());
+ if(j == 0)
+ break;
+ *pPayLoad = m_PayLoad.c_str();
+ int i = strlen(m_PayLoad.c_str());
+ //printf("i:%d\n", i);
+ //If payload has nonzero length
+ if(i > 0)
+ {
+ //printf("if i> 0\n");
+ break;
+ }
+ } while(true);
+
+
return *this;
}
@@ -245,13 +279,22 @@
// for the time being just get the payload. Here we need much work
m_bStatus = true;
- std::string::size_type pos = p_HttpPacket.find('\n'), nxtpos;
-
- int nHttpSatus;
-
- if(pos == std::string::npos) return; //unexpected string
-
- std::string strLine = p_HttpPacket.substr(0, pos + 1);
+ int nHttpSatus;
+
+ m_sHeader += p_HttpPacket;
+
+ //printf("m_sHeader:%s\n", m_sHeader.c_str());
+ std::string::size_type pos, nxtpos;
+ pos = p_HttpPacket.find("\r\n\r\n");
+ if(pos == std::string::npos)
+ {
+ m_PayLoad = "";
+ return; //unexpected string
+ }
+
+ m_IsHttpHeader = 1; //We have the stream until payload
+ pos = m_sHeader.find('\n');
+ std::string strLine = m_sHeader.substr(0, pos + 1);
std::string::size_type offset = pos + 1;
// Check for HTTP header validity; HTTP 1.0 / HTTP 1.0 is supported.
@@ -273,27 +316,28 @@
// Status code is 2xx; so valid packet. hence go ahead and extract the payload.
if(nHttpSatus == 2)
{
- GetPayLoad(p_HttpPacket, offset);
+ //printf("nHttpSatus is 2\n");
+ GetPayLoad(m_sHeader, offset);
}
else if(nHttpSatus == 3) // Status code is 3xx; some error has occurred
{
// error recovery mechanism should go here
- Error(p_HttpPacket.c_str());
+ Error(m_sHeader.c_str());
throw ChannelException("HTTP Error, cannot process response message...");
}
else if(nHttpSatus == 4) // Status code is 4xx; some error has occurred
{
// error recovery mechanism should go here
- Error(p_HttpPacket.c_str());
+ Error(m_sHeader.c_str());
throw ChannelException("HTTP Error, cannot process response message...");
}
else if(nHttpSatus == 5) // Status code is 5xx; some error has occurred
{
// error recovery mechanism should go here
- GetPayLoad(p_HttpPacket, offset);
+ GetPayLoad(m_sHeader, offset);
if (!m_bStatus)
{
- Error(p_HttpPacket.c_str());
+ Error(m_sHeader.c_str());
throw AxisException(HTTP_ERROR);
}
}
@@ -313,7 +357,8 @@
{
std::string::size_type pos, nxtpos;
std::string strLine;
- m_Length=0;
+ //int len=0;
+
// process rest of the HTTP packet
while (true)
{
@@ -327,23 +372,28 @@
// Get the payload size from the header.
if((pos = strLine.find("Content-Length:")) != std::string::npos)
- m_Length = atoi(strLine.substr(pos + strlen("Content-Length: ")).c_str());
+ m_intBodyLength = atoi(strLine.substr(pos + strlen("Content-Length: ")).c_str());
+ //printf("m_intBodyLength:%d\n", m_intBodyLength);
}
m_PayLoad = p_HttpPacket.substr(offset);
+ //printf("m_PayLoad:%s\n", m_PayLoad.c_str());
+
- pos = m_PayLoad.rfind('0');
+ //pos = m_PayLoad.rfind('0');
- if(std::string::npos != pos && m_PayLoad[pos+1] != '\"')
- {
+ //if(std::string::npos != pos && m_PayLoad[pos+1] != '\"')
+ //{
//nxtpos = m_PayLoad.find("1df");
//if(std::string::npos != nxtpos && '\n' == m_PayLoad[nxtpos+4])
- {
+ //{
+ //m_bStatus = false; // we have the payload
// Extract the SOAP message
- m_PayLoad = m_PayLoad.substr(m_PayLoad.find('<'));
- // m_PayLoad = m_PayLoad.substr(0, m_PayLoad.rfind('>') + 1);
- }
- }
+ //m_PayLoad = m_PayLoad.substr(m_PayLoad.find('<'));
+ //m_PayLoad = m_PayLoad.substr(0, m_PayLoad.rfind('>') + 1);
+ //}
+ //}
+
#ifdef _DEBUG
std::cout << "Payload:\n" << m_PayLoad << std::endl;
#endif
@@ -367,3 +417,19 @@
{
m_AdditionalHeader.clear();
}
+
+int HttpTransport::getBodyLength()
+{
+ return m_intBodyLength;
+}
+
+void HttpTransport::setBodyLength(int bodyLength)
+{
+ m_intBodyLength = bodyLength;
+
+}
+
+int HttpTransport::getIsHttpHeader()
+{
+ return m_IsHttpHeader;
+}
\ No newline at end of file
1.4.2.2 +31 -2 ws-axis/c/src/client/transport/axis/Receiver.cpp
Index: Receiver.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/client/transport/axis/Receiver.cpp,v
retrieving revision 1.4.2.1
retrieving revision 1.4.2.2
diff -u -r1.4.2.1 -r1.4.2.2
--- Receiver.cpp 12 Dec 2003 13:49:20 -0000 1.4.2.1
+++ Receiver.cpp 6 Jan 2004 07:46:40 -0000 1.4.2.2
@@ -59,11 +59,13 @@
*
*
* @author Lilantha Darshana (lilantha@virtusa.com)
+ * @author Damitha Kumarage (damitha@jkcsworld.com, damitha@opensource.lk)
*
*/
#include <axis/client/transport/axis/Platform.hpp>
#include <axis/client/transport/axis/Receiver.hpp>
+#include <axis/client/transport/axis/HttpTransport.hpp>
#include <iostream>
@@ -74,17 +76,28 @@
const char* Receiver::Recv(int nMaxToRead) throw (AxisException)
{
+ int bodyLength;
+ int isHttpHeader;
const char* pToReturn = NULL;
-
+ isHttpHeader = m_pTrChannel->getIsHttpHeader();
+ bodyLength = m_pTrChannel->getBodyLength();
+ //printf("isHttpHeader:%d\n", isHttpHeader);
+ if(isHttpHeader == 1 && bodyLength == 0)
+ return "";
if (0 == m_BytesRead)
{
try
{
+ //printf("try\n");
*m_pTrChannel >> (&m_pMsg);
- m_MsgSize = strlen(m_pMsg);
+ if(m_pMsg == NULL)
+ return NULL;
+
+ m_MsgSize = strlen(m_pMsg);
}
catch(AxisException& ex)
{
+ printf("catch\n");
// Get the fault message.
*m_pTrChannel >> (&m_pMsg);
m_MsgSize = strlen(m_pMsg);
@@ -94,20 +107,36 @@
}
catch(...)
{
+ printf("catch(...)\n");
throw AxisException(RECEPTION_ERROR);
}
}
+ //printf("m_MsgSize:%d\n", m_MsgSize);
if (m_MsgSize > 0)
{
+ bodyLength = m_pTrChannel->getBodyLength();
+ //printf("m_MsgSize:%d\n", m_MsgSize);
+ //printf("bodyLength:%d\n", bodyLength);
+ bodyLength -= m_MsgSize;
+ m_pTrChannel->setBodyLength(bodyLength);
pToReturn = m_pMsg;
m_BytesRead = (m_MsgSize < nMaxToRead) ? m_MsgSize : nMaxToRead;
+ //printf("m_BytesRead:%d\n", m_BytesRead);
m_MsgSize -= m_BytesRead;
m_pMsg += m_BytesRead;
+ m_BytesRead = 0;
+
return pToReturn;
}
else
{
+ printf("m_MsgSize == 0, so return NULL\n");
return NULL;
}
+}
+
+int Receiver::getBytesRead()
+{
+ return m_BytesRead;
}
1.3.2.1 +2 -0 ws-axis/c/src/client/transport/axis/Transport.cpp
Index: Transport.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/client/transport/axis/Transport.cpp,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -r1.3 -r1.3.2.1
--- Transport.cpp 20 Oct 2003 06:37:58 -0000 1.3
+++ Transport.cpp 6 Jan 2004 07:46:40 -0000 1.3.2.1
@@ -75,3 +75,5 @@
}
+
+
No revision
No revision
1.1.2.3 +1 -0 ws-axis/c/src/soap/Attic/SoapBinInputStream.cpp
Index: SoapBinInputStream.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/soap/Attic/SoapBinInputStream.cpp,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- SoapBinInputStream.cpp 12 Dec 2003 13:47:20 -0000 1.1.2.2
+++ SoapBinInputStream.cpp 6 Jan 2004 07:46:40 -0000 1.1.2.3
@@ -32,5 +32,6 @@
{
int nRead = 0;
m_pReadFunct((char*)toFill, maxToRead, &nRead, m_pContext);
+
return nRead;
}