Skip to content

Interop - #40

Open
kafkiansky wants to merge 9 commits into
0.4.xfrom
interop
Open

kafkiansky wants to merge 9 commits into
0.4.xfrom
interop

Conversation

@kafkiansky

Copy link
Copy Markdown
Contributor

closes #34

@kafkiansky kafkiansky self-assigned this Oct 11, 2026
@kafkiansky kafkiansky added the enhancement New feature or request label Oct 11, 2026
On GitHub runners localhost resolves to ::1 as well, and the server listening
on 0.0.0.0 only refused the client whenever it picked the IPv6 address. Listen
on both, like the grpc-go server, and put an IPv6 --server_host in brackets.
The connection used to be established lazily inside the HTTP request, so a
failure to connect surfaced only once the call was already running and the
call failed even if another endpoint was reachable. Like pick_first in grpc-go,
start the call only on an established connection: StreamFactory waits until
amphp acquires one, and DefaultConnection excludes an endpoint it cannot
connect to and picks the next one, failing with UNAVAILABLE once every
endpoint is excluded.

The deadline of timeout_on_sleeping_server may now expire while the call
waits for the connection, which grpc-go also accepts.
PickFirst shuffled the endpoints, while pick_first in grpc-go keeps their
order by default. Pick the first endpoint in resolution order instead.
PickFirstFactory no longer takes a Randomizer.
A target such as [::1]:50051 keeps the brackets in its host, and DnsResolver
passed them to amphp/dns, which rejected the name and failed the call with
UNAVAILABLE. Strip them, so amphp returns the literal as is, like grpc-go.
amphp takes :authority from the request URI, which carried the resolved
endpoint address, so the server saw ip:port instead of the target name. Like
grpc-go, the authority is now the peer name of the transport credentials if
set, localhost for unix, otherwise the target address, or the first one when
the target lists several.

The URI carries this authority, while the endpoint address travels as a
request attribute: EndpointConnectionPool keeps a pool per endpoint and
AddressSocketConnector connects to that address. As a result unix targets
work, and SNI defaults to the target name. A client passed to
withHttpClient() knows nothing about the attribute and keeps receiving the
endpoint address in the URI.
amphp/pipeline 1.2.0 throws "Must call suspend() before calling throw()" when
a queue is completed while a cancelled consumer is still waiting on it, fixed
in 1.2.1. Now that a call starts only on an established connection, the
request body is already being read when the call is cancelled, so the lowest
dependencies hit it in ClientCancellationTest.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement test interop

1 participant