Skip to content

Commit

Permalink
Make package compatible with stream interface Compatibility stream in…
Browse files Browse the repository at this point in the history
…terface v2 (#75)

* make compatible with stream interface

* 🚨 Explicitly specify what features of HTTP client is not supported by current implementation to avoid having failed tests

* 📦 Explicitly declare compatibility versions for `psr/http-message`

There is implementation for interface from this package

* 📦 `fread` requires to pass only `int<1, max>` - early return empty string in case of `0` length

---------

Co-authored-by: David Buchmann <david@liip.ch>
  • Loading branch information
andrew-demb and dbu authored Sep 1, 2024
1 parent 4a69954 commit 1f8fecc
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 41 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ name: CI
on:
push:
branches:
- 2.x
- '[0-9]+.x'
- '[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.x'
pull_request:

jobs:
Expand Down Expand Up @@ -91,7 +93,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
php-version: 8.3
tools: composer
coverage: xdebug

Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Change Log

## 2.3.0

* Fixed compatibility with `psr/http-message` v2
* The `Http\Client\Socket\Stream` has BC breaks if you extended it. It is not meant to be extended, declaring it as `@internal` now.

## 2.2.0

* Allow installation with Symfony 7
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ First launch the http server:
$ ./vendor/bin/http_test_server > /dev/null 2>&1 &
```

Then generate ssh certificates:
Then generate SSL certificates:

```bash
$ composer gen-ssl
Expand Down
18 changes: 10 additions & 8 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,20 @@
}
],
"require": {
"php": "^7.2 || ^8.0",
"nyholm/psr7": "^1.3",
"php-http/httplug": "^2.0",
"php": "^8.1",
"nyholm/psr7": "^1.8.1",
"php-http/httplug": "^2.4",
"psr/http-client": "^1.0",
"psr/http-message": "^1.0 || ^2.0",
"symfony/options-resolver": "^2.6 || ^3.4 || ^4.4 || ^5.0 || ^6.0 || ^7.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.2 || ^3.0",
"php-http/client-integration-tests": "^3.0",
"php-http/message": "^1.9",
"php-http/client-common": "^2.3",
"phpunit/phpunit": "^8.5.23 || ~9.5"
"friendsofphp/php-cs-fixer": "^3.51",
"php-http/client-integration-tests": "^3.1.1",
"php-http/message": "^1.16",
"php-http/client-common": "^2.7",
"phpunit/phpunit": "^8.5.23 || ~9.5",
"php-http/message-factory": "^1.1"
},
"provide": {
"php-http/client-implementation": "1.0",
Expand Down
1 change: 0 additions & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
<testsuites>
<testsuite name="Socket Client Test Suite">
<directory>tests/</directory>
<exclude>tests/SocketClientFeatureTest.php</exclude>
</testsuite>
</testsuites>
<php>
Expand Down
6 changes: 0 additions & 6 deletions src/ResponseReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use Http\Client\Socket\Exception\BrokenPipeException;
use Http\Client\Socket\Exception\TimeoutException;
use Http\Message\ResponseFactory;
use Nyholm\Psr7\Response;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
Expand All @@ -18,11 +17,6 @@
*/
trait ResponseReader
{
/**
* @var ResponseFactory For creating response
*/
protected $responseFactory;

/**
* Read a response from a socket.
*
Expand Down
37 changes: 18 additions & 19 deletions src/Stream.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public function __construct(RequestInterface $request, $socket, ?int $size = nul
$this->request = $request;
}

public function __toString()
public function __toString(): string
{
try {
return $this->getContents();
Expand All @@ -70,7 +70,7 @@ public function __toString()
}
}

public function close()
public function close(): void
{
if ($this->isDetached || null === $this->socket) {
throw new StreamException('Stream is detached');
Expand All @@ -93,12 +93,12 @@ public function detach()
/**
* @return int<0, max>|null
*/
public function getSize()
public function getSize(): ?int
{
return $this->size;
}

public function tell()
public function tell(): int
{
if ($this->isDetached || null === $this->socket) {
throw new StreamException('Stream is detached');
Expand All @@ -111,7 +111,7 @@ public function tell()
return $tell;
}

public function eof()
public function eof(): bool
{
if ($this->isDetached || null === $this->socket) {
throw new StreamException('Stream is detached');
Expand All @@ -120,50 +120,49 @@ public function eof()
return feof($this->socket);
}

public function isSeekable()
public function isSeekable(): bool
{
return false;
}

/**
* @return void
*/
public function seek($offset, $whence = SEEK_SET)
public function seek($offset, $whence = SEEK_SET): void
{
throw new StreamException('This stream is not seekable');
}

/**
* @return void
*/
public function rewind()
public function rewind(): void
{
throw new StreamException('This stream is not seekable');
}

public function isWritable()
public function isWritable(): bool
{
return false;
}

public function write($string)
public function write($string): int
{
throw new StreamException('This stream is not writable');
}

public function isReadable()
public function isReadable(): bool
{
return true;
}

/**
* @param int<0, max> $length
*/
public function read($length)
public function read($length): string
{
if (0 === $length) {
return '';
}

if ($this->isDetached || null === $this->socket) {
throw new StreamException('Stream is detached');
}

if (null === $this->getSize()) {
$read = fread($this->socket, $length);
if (false === $read) {
Expand Down Expand Up @@ -197,7 +196,7 @@ public function read($length)
return $read;
}

public function getContents()
public function getContents(): string
{
if ($this->isDetached || null === $this->socket) {
throw new StreamException('Stream is detached');
Expand Down
25 changes: 25 additions & 0 deletions tests/SocketClientFeatureTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,29 @@ protected function createClient(): ClientInterface
{
return new SocketHttpClient();
}

public function testAutoSetContentLength(): void
{
$this->markTestSkipped('Feature is unsupported');
}

public function testGzip(): void
{
$this->markTestSkipped('Feature is unsupported');
}

public function testDeflate(): void
{
$this->markTestSkipped('Feature is unsupported');
}

public function testChunked(): void
{
$this->markTestSkipped('Feature is unsupported');
}

public function testRedirect(): void
{
$this->markTestSkipped('Feature is unsupported');
}
}
6 changes: 2 additions & 4 deletions tests/SocketHttpClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@
use Http\Client\Socket\Client as SocketHttpClient;
use Http\Client\Socket\Exception\NetworkException;
use Http\Client\Socket\Exception\TimeoutException;
use Http\Message\MessageFactory\GuzzleMessageFactory;
use Nyholm\Psr7\Factory\Psr17Factory;

class SocketHttpClientTest extends BaseTestCase
{
public function createClient($options = [])
{
$messageFactory = new GuzzleMessageFactory();

return new HttpMethodsClient(new SocketHttpClient($options), $messageFactory);
return new HttpMethodsClient(new SocketHttpClient($options), new Psr17Factory());
}

public function testTcpSocketDomain()
Expand Down

0 comments on commit 1f8fecc

Please sign in to comment.