diff --git a/src/Uri/IncludePathBuilder.php b/src/Uri/IncludePathBuilder.php index dd35be8..b26e7cb 100644 --- a/src/Uri/IncludePathBuilder.php +++ b/src/Uri/IncludePathBuilder.php @@ -4,18 +4,34 @@ namespace Soap\Wsdl\Uri; -use League\Uri\BaseUri; use League\Uri\Modifier; +use League\Uri\Uri; +use function Psl\Str\starts_with; final class IncludePathBuilder { public static function build(string $relativePath, string $fromFile): string { - return Modifier::from(BaseUri::from($fromFile)->resolve($relativePath)) + $baseUri = match(true) { + starts_with($fromFile, '/') => Uri::fromUnixPath($fromFile), + default => Uri::new($fromFile), + }; + + $resolvedUri = $baseUri->resolve($relativePath); + $modifier = Modifier::wrap($resolvedUri) ->removeDotSegments() - ->removeEmptySegments() - ->getUri() - ->__toString() - ; + ->removeEmptySegments(); + + /** + * @var Uri $relativeUri + * @psalm-suppress UndefinedClass PHP's URI classes are only available from PHP 8.5 + */ + $relativeUri = $modifier->unwrap(); + + if ($relativeUri->getScheme() === 'file') { + return $relativeUri->getPath(); + } + + return $relativeUri->toString(); } } diff --git a/tests/Unit/Uri/IncludePathBuilderTest.php b/tests/Unit/Uri/IncludePathBuilderTest.php index d34abfc..7e023c0 100644 --- a/tests/Unit/Uri/IncludePathBuilderTest.php +++ b/tests/Unit/Uri/IncludePathBuilderTest.php @@ -20,13 +20,13 @@ public static function provideBuildPaths() { yield 'same-dir-file' => [ 'relativePath' => 'otherfile.xml', - 'fromFile' => 'somedir/somefile.xml', - 'expected' => 'somedir/otherfile.xml', + 'fromFile' => '/somedir/somefile.xml', + 'expected' => '/somedir/otherfile.xml', ]; yield 'child-dir-file' => [ 'relativePath' => '../otherfile.xml', - 'fromFile' => 'somedir/child/somefile.xml', - 'expected' => 'somedir/otherfile.xml', + 'fromFile' => '/somedir/child/somefile.xml', + 'expected' => '/somedir/otherfile.xml', ]; yield 'http-file' => [ 'relativePath' => 'otherfile.xml',