Skip to content

Commit

Permalink
fix regression bug in HTTPClient FS#2621
Browse files Browse the repository at this point in the history
In the recent refactoring of the HTTPClient, a problem with certain
systems was reintroduced. On these systems a select() call always
waits for a timeout on the first call before working properly on the
second call.

This patch reintroduces the shorter timeouts with usleep rate limiting
again.

Since this bug is not reproducible on other systems it can't be unit
tested unfortunately.
  • Loading branch information
splitbrain committed Nov 6, 2012
1 parent 6e19703 commit bfd975d
Showing 1 changed file with 26 additions and 28 deletions.
54 changes: 26 additions & 28 deletions inc/HTTPClient.php
Expand Up @@ -509,15 +509,17 @@ function _sendData($socket, $data, $message) {
if(feof($socket))
throw new HTTPClientException("Socket disconnected while writing $message");

// wait for stream ready or timeout
self::selecttimeout($this->timeout - $time_used, $sec, $usec);
if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
// write to stream
$nbytes = fwrite($socket, substr($data,$written,4096));
if($nbytes === false)
throw new HTTPClientException("Failed writing to socket while sending $message", -100);
$written += $nbytes;
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
usleep(1000);
continue;
}

// write to stream
$nbytes = fwrite($socket, substr($data,$written,4096));
if($nbytes === false)
throw new HTTPClientException("Failed writing to socket while sending $message", -100);
$written += $nbytes;
}
}

Expand Down Expand Up @@ -556,15 +558,17 @@ function _readData($socket, $nbytes, $message, $ignore_eof = false) {
}

if ($to_read > 0) {
// wait for stream ready or timeout
self::selecttimeout($this->timeout - $time_used, $sec, $usec);
if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
$bytes = fread($socket, $to_read);
if($bytes === false)
throw new HTTPClientException("Failed reading from socket while reading $message", -100);
$r_data .= $bytes;
$to_read -= strlen($bytes);
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
usleep(1000);
continue;
}

$bytes = fread($socket, $to_read);
if($bytes === false)
throw new HTTPClientException("Failed reading from socket while reading $message", -100);
$r_data .= $bytes;
$to_read -= strlen($bytes);
}
} while ($to_read > 0 && strlen($r_data) < $nbytes);
return $r_data;
Expand Down Expand Up @@ -595,11 +599,13 @@ function _readLine($socket, $message) {
if(feof($socket))
throw new HTTPClientException("Premature End of File (socket) while reading $message");

// wait for stream ready or timeout
self::selecttimeout($this->timeout - $time_used, $sec, $usec);
if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
$r_data = fgets($socket, 1024);
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
usleep(1000);
continue;
}

$r_data = fgets($socket, 1024);
} while (!preg_match('/\n$/',$r_data));
return $r_data;
}
Expand Down Expand Up @@ -629,14 +635,6 @@ static function _time(){
return ((float)$usec + (float)$sec);
}

/**
* Calculate seconds and microseconds
*/
static function selecttimeout($time, &$sec, &$usec){
$sec = floor($time);
$usec = (int)(($time - $sec) * 1000000);
}

/**
* convert given header string to Header array
*
Expand Down

0 comments on commit bfd975d

Please sign in to comment.