nguyenquyet2810 / nusoap-for-php5

Automatically exported from code.google.com/p/nusoap-for-php5
GNU Lesser General Public License v2.1
0 stars 0 forks source link

nusoap - EOF reached before processing content-length bytes #4

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Client sends soap request to server
2. Client receives soap data
3. Client receives EOF before processing all of http content-length bytes.

What is the expected output? What do you see instead?
All content-length bytes shall be received.

What version of the product are you using? On what operating system?
nusoap-for-php5 (0.9)
PHP 5.2.11
Windows Server 2008

Please provide any additional information below.

NuSoap experts,

I'm moving my website, powered by PHP, from a Linux server to a Windows
Server 2008 server. My website uses nusoap for XML web services. One of my
scripts which run perfectly on the linux server, is failing on the windows
server. On the windows server, the nusoap is failing to receive all data.
For example, if 29,778 is expected from the SOAP server, only 6,729 bytes
are being received by the client on the windows server before EOF. The
feof() function call in nusoap getResponse() (around line number 2656) is
detecting EOF prematurely before reading all the data. If I add a
"usleep(250000)" after each "fread()" in nusoap.php getResponse() as shown
below, all data is received as expected. I've added some debugging and
determined that the feof() which is returning true is the feof in the while
loop on line 2655 of nusoap.php in getResponse().

The following is the debug info for nusoap 0.7.2 (actually is google's
nusoap for php5 - 0.9). Note the content-length and the length of data
actually read on the socket before EOF.
...
2009-11-15 11:12:49.194406 soapclientNusoap: transporting via HTTP
2009-11-15 11:12:49.197422 soapclientNusoap: sending message, length=904
2009-11-15 11:12:49.194785 soap_transport_http: scheme = http
2009-11-15 11:12:49.195125 soap_transport_http: host = toywebservices.com
2009-11-15 11:12:49.195435 soap_transport_http: path =
/toywebservice/toywebservice.asmx
2009-11-15 11:12:49.195755 soap_transport_http: query = WSDL
2009-11-15 11:12:49.196101 soap_transport_http: set Host: toywebservices.com
2009-11-15 11:12:49.196447 soap_transport_http: set User-Agent:
NuSOAP/0.7.2 (1.94)
2009-11-15 11:12:49.196784 soap_transport_http: set Content-Type: text/xml;
charset=UTF-8
2009-11-15 11:12:49.197104 soap_transport_http: set SOAPAction:
"http://toywebservices.com/toywebservice/GetToys"
2009-11-15 11:12:49.197770 soap_transport_http: entered send()
soapclientsoap with data of length: 904
2009-11-15 11:12:49.198106 soap_transport_http: connect connection_timeout
0, response_timeout 30, scheme http, host toywebservices.com, port 80
2009-11-15 11:12:49.198420 soap_transport_http: calling fsockopen with host
toywebservices.com connection_timeout 0
2009-11-15 11:12:49.248629 soap_transport_http: set response timeout to 30
2009-11-15 11:12:49.249045 soap_transport_http: socket connected
2009-11-15 11:12:49.249386 soap_transport_http: set Content-Length: 904
2009-11-15 11:12:49.249723 soap_transport_http: HTTP request: POST
/toywebservice/toywebservice.asmx?WSDL HTTP/1.0
2009-11-15 11:12:49.250047 soap_transport_http: HTTP header: Host:
toywebservices.com
2009-11-15 11:12:49.250644 soap_transport_http: HTTP header: User-Agent:
NuSOAP/0.7.2 (1.94)
2009-11-15 11:12:49.250870 soap_transport_http: HTTP header: Content-Type:
text/xml; charset=UTF-8
2009-11-15 11:12:49.251095 soap_transport_http: HTTP header: SOAPAction:
"http://toywebservices.com/toywebservice/GetToys"
2009-11-15 11:12:49.251322 soap_transport_http: HTTP header:
Content-Length: 904
2009-11-15 11:12:49.251600 soap_transport_http: wrote data to socket,
length = 1178
2009-11-15 11:12:49.495428 soap_transport_http: read line of 17 bytes:
HTTP/1.1 200 OK
2009-11-15 11:12:49.496245 soap_transport_http: read line of 19 bytes:
Connection: close
2009-11-15 11:12:49.496577 soap_transport_http: read line of 37 bytes:
Date: Sun, 15 Nov 2009 17:12:48 GMT
2009-11-15 11:12:49.496896 soap_transport_http: read line of 27 bytes:
Server: Microsoft-IIS/6.0
2009-11-15 11:12:49.497215 soap_transport_http: read line of 23 bytes:
X-Powered-By: ASP.NET
2009-11-15 11:12:49.497531 soap_transport_http: read line of 29 bytes:
X-AspNet-Version: 2.0.50727
2009-11-15 11:12:49.497860 soap_transport_http: read line of 35 bytes:
Cache-Control: private, max-age=0
2009-11-15 11:12:49.498177 soap_transport_http: read line of 39 bytes:
Content-Type: text/xml; charset=utf-8
2009-11-15 11:12:49.498494 soap_transport_http: read line of 23 bytes:
Content-Length: 29778
2009-11-15 11:12:49.498825 soap_transport_http: read line of 2 bytes:
2009-11-15 11:12:49.499211 soap_transport_http: found end of headers after
length 251
2009-11-15 11:12:49.499648 soap_transport_http: want to read content of
length 29778 <<<<<<<<<<<<<< Data received 29,778 B
2009-11-15 11:12:49.500080 soap_transport_http: read buffer of 3969 bytes
2009-11-15 11:12:49.550862 soap_transport_http: read buffer of 2760 bytes
2009-11-15 11:12:49.551665 soap_transport_http: read to EOF
2009-11-15 11:12:49.551984 soap_transport_http: read body of length 6729
<<<<<<<<<<<<<< data read much less than 29,778 B
2009-11-15 11:12:49.552329 soap_transport_http: received a total of 6980
bytes of data from server
2009-11-15 11:12:49.552910 soap_transport_http: closed socket
2009-11-15 11:12:49.553266 soap_transport_http: No Content-Encoding header
2009-11-15 11:12:49.553603 soap_transport_http: end of send()
2009-11-15 11:12:49.553950 soapclientNusoap: got response, length=6729
type=text/xml; charset=utf-8
2009-11-15 11:12:49.554268 soapclientNusoap: Entering parseResponse() for
data of length 6729 and type text/xml; charset=utf-8
2009-11-15 11:12:49.554619 soapclientNusoap: Got response encoding: utf-8
2009-11-15 11:12:49.555015 soapclientNusoap: Use encoding: UTF-8 when
creating soap_parser
2009-11-15 11:12:49.555648 soap_parser: Charset from HTTP Content-Type
matches encoding from XML declaration
2009-11-15 11:12:49.555967 soap_parser: Entering soap_parser(),
length=6729, encoding=UTF-8
2009-11-15 11:12:49.556838 soap_parser: found root struct GetToysResponse,
pos 2
..
2009-11-15 11:12:49.592188 soap_parser: XML error parsing SOAP payload on
line 1: Invalid document end
2009-11-15 11:12:49.592534 soap_parser: XML payload:...
...
2009-11-15 11:12:49.593503 soapclientNusoap: Error: XML error parsing SOAP
payload on line 1: Invalid document end
</pre>

nusoap.php getResponse()
....
..
while (($strlen < $content_length) && (!feof($this->fp))) {
echo "<br><br>loop count $loopCount";
echo "<br> top strlen $strlen";

$readlen = min(8192, $content_length - $strlen);
$tmp = fread($this->fp, $readlen);
$tmplen = strlen($tmp);
$this->debug("read buffer of $tmplen bytes");
usleep(250000); # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$this->debug("$tmp");

if (($tmplen == 0) && (!feof($this->fp))) {
$this->incoming_payload = $data;
$this->debug('socket read of body timed out after length ' . strlen($data));
$this->debug("read before timeout:\n" . $data);
$this->setError('socket read of body timed out');
return false;
}
$strlen += $tmplen;
$data .= $tmp;

....

Here's the successful result when the usleep is added:

2009-11-15 11:30:03.923987 soapclientNusoap: transporting via HTTP
2009-11-15 11:30:03.927135 soapclientNusoap: sending message, length=904
2009-11-15 11:30:03.924362 soap_transport_http: scheme = http
2009-11-15 11:30:03.924740 soap_transport_http: host = toywebservices.com
2009-11-15 11:30:03.925052 soap_transport_http: path =
/toywebservice/toywebservice.asmx
2009-11-15 11:30:03.925363 soap_transport_http: query = WSDL
2009-11-15 11:30:03.925771 soap_transport_http: set Host: toywebservices.com
2009-11-15 11:30:03.926142 soap_transport_http: set User-Agent:
NuSOAP/0.7.2 (1.94)
2009-11-15 11:30:03.926469 soap_transport_http: set Content-Type: text/xml;
charset=UTF-8
2009-11-15 11:30:03.926817 soap_transport_http: set SOAPAction:
&quot;http://toywebservices.com/toywebservice/GetToys&quot;
2009-11-15 11:30:03.927473 soap_transport_http: entered send()
soapclientsoap with data of length: 904
2009-11-15 11:30:03.927840 soap_transport_http: connect connection_timeout
0, response_timeout 30, scheme http, host toywebservices.com, port 80
2009-11-15 11:30:03.928155 soap_transport_http: calling fsockopen with host
toywebservices.com connection_timeout 0
2009-11-15 11:30:03.972269 soap_transport_http: set response timeout to 30
2009-11-15 11:30:03.972654 soap_transport_http: socket connected
2009-11-15 11:30:03.972983 soap_transport_http: set Content-Length: 904
2009-11-15 11:30:03.973304 soap_transport_http: HTTP request: POST
/toywebservice/toywebservice.asmx?WSDL HTTP/1.0
2009-11-15 11:30:03.973642 soap_transport_http: HTTP header: Host:
toywebservices.com
2009-11-15 11:30:03.973962 soap_transport_http: HTTP header: User-Agent:
NuSOAP/0.7.2 (1.94)
2009-11-15 11:30:03.974281 soap_transport_http: HTTP header: Content-Type:
text/xml; charset=UTF-8
2009-11-15 11:30:03.974611 soap_transport_http: HTTP header: SOAPAction:
&quot;http://toywebservices.com/toywebservice/GetToys&quot;
2009-11-15 11:30:03.974930 soap_transport_http: HTTP header:
Content-Length: 904
2009-11-15 11:30:03.975299 soap_transport_http: wrote data to socket,
length = 1178
2009-11-15 11:30:04.384516 soap_transport_http: read line of 17 bytes:
HTTP/1.1 200 OK
2009-11-15 11:30:04.384917 soap_transport_http: read line of 19 bytes:
Connection: close
2009-11-15 11:30:04.385237 soap_transport_http: read line of 37 bytes:
Date: Sun, 15 Nov 2009 17:30:03 GMT
2009-11-15 11:30:04.385955 soap_transport_http: read line of 27 bytes:
Server: Microsoft-IIS/6.0
2009-11-15 11:30:04.386273 soap_transport_http: read line of 23 bytes:
X-Powered-By: ASP.NET
2009-11-15 11:30:04.386593 soap_transport_http: read line of 29 bytes:
X-AspNet-Version: 2.0.50727
2009-11-15 11:30:04.386975 soap_transport_http: read line of 35 bytes:
Cache-Control: private, max-age=0
2009-11-15 11:30:04.387428 soap_transport_http: read line of 39 bytes:
Content-Type: text/xml; charset=utf-8
2009-11-15 11:30:04.387896 soap_transport_http: read line of 23 bytes:
Content-Length: 29778
2009-11-15 11:30:04.388216 soap_transport_http: read line of 2 bytes:
2009-11-15 11:30:04.388597 soap_transport_http: found end of headers after
length 251
2009-11-15 11:30:04.389030 soap_transport_http: want to read content of
length 29778 <<<<<<<<<<<<< Data is 29.778 Bytes
2009-11-15 11:30:04.389484 soap_transport_http: read buffer of 8192 bytes
2009-11-15 11:30:04.629347 soap_transport_http: read buffer of 8192 bytes
2009-11-15 11:30:04.879362 soap_transport_http: read buffer of 8192 bytes
2009-11-15 11:30:05.129402 soap_transport_http: read buffer of 5202 bytes
2009-11-15 11:30:05.379715 soap_transport_http: read to EOF
2009-11-15 11:30:05.380081 soap_transport_http: read body of length 29778
<<<<<<<<<<<<< Read all 29.778 Bytes
2009-11-15 11:30:05.380486 soap_transport_http: received a total of 30029
bytes of data from server
2009-11-15 11:30:05.380933 soap_transport_http: closed socket
2009-11-15 11:30:05.381278 soap_transport_http: No Content-Encoding header
2009-11-15 11:30:05.381613 soap_transport_http: end of send()
2009-11-15 11:30:05.381998 soapclientNusoap: got response, length=29778
type=text/xml; charset=utf-8
2009-11-15 11:30:05.382317 soapclientNusoap: Entering parseResponse() for
data of length 29778 and type text/xml; charset=utf-8
2009-11-15 11:30:05.382654 soapclientNusoap: Got response encoding: utf-8
2009-11-15 11:30:05.383051 soapclientNusoap: Use encoding: UTF-8 when
creating soap_parser
2009-11-15 11:30:05.383689 soap_parser: Charset from HTTP Content-Type
matches encoding from XML declaration
2009-11-15 11:30:05.384006 soap_parser: Entering soap_parser(),
length=29778, encoding=UTF-8
2009-11-15 11:30:05.384975 soap_parser: found root struct GetToysResponse,
pos 2
...
..
2009-11-15 11:30:05.543380 soap_parser: in buildVal, adding Java Vector
GetToysResponse
2009-11-15 11:30:05.543746 soap_parser: parsed successfully, found root
struct: 2 of name GetToysResponse
2009-11-15 11:30:05.546637 soapclientNusoap: sent message successfully and
got a(n) array
return=array(1) {
..
...

Does anyone know the fix for this issue? I could leave the usleep in place,
I'm just afraid that this is just a hack and not a valid fix.

Thanks,
Jas

Original issue reported on code.google.com by JassenM@gmail.com on 15 Nov 2009 at 5:56