hiboyang commented on PR #56933:
URL: https://github.com/apache/spark/pull/56933#issuecomment-4859971286

   > ## Review feedback
   > Two issues in `PathAwareChannelBuilder._extract_attributes` 
(`python/pyspark/sql/connect/client/core.py`).
   > 
   > ### 1. IPv6 endpoints are rejected (`core.py:667`)
   > `netloc = self.url.netloc.split(":")` with `len(netloc) in (1, 2)` breaks 
on IPv6 addresses:
   > 
   > * `sc://[::1]:15002/path1` -> `netloc='[::1]:15002'` -> `split(':')` 
yields `['[', '', '1]', '15002']` (4 parts) -> falls into the `else` branch and 
raises `INVALID_CONNECT_URL`.
   > * `sc://[::1]/path1` -> `['[', '', '1]']` (3 parts) -> same failure.
   > 
   > `DefaultChannelBuilder` (`core.py:486-495`) handles this correctly by 
using `self.url.hostname` / `self.url.port` and bracket-wrapping IPv6 hosts, so 
this new builder is a functional regression for IPv6 users. Two related issues 
on the same path:
   > 
   > * `sc://host:abc/p` -> `int(netloc[1])` raises a raw `ValueError` instead 
of the wrapped `PySparkValueError`.
   > * `sc://:15002/p` -> `['', '15002']` (2 parts) -> `host=''` is silently 
accepted.
   > 
   > Suggested fix: parse host/port via `self.url.hostname` / `self.url.port` 
as `DefaultChannelBuilder` does (correct IPv6 bracket-wrapping, hostname 
validation, consistent error path), and derive `netloc_has_port` from 
`self.url.port is not None`.
   > 
   > ### 2. Path port is lost when combined with the standard `/;params` form 
(`core.py:688-700`)
   > The trailing-path-port syntax loses the intended port when users combine 
it with Spark's existing `/;param=value` form. For example 
`sc://gateway/app/driver:443/;token=abc` parses (via `urlparse`) to 
`path='/app/driver:443/'`, `params='token=abc'`. Then:
   > 
   > * `last_segment = prefix.rsplit("/", 1)[-1]` on `/app/driver:443/` -> `''` 
(the trailing slash leaves an empty last segment).
   > * `":" in last_segment` is therefore `False`, so the port-extraction block 
(lines 693-700) is skipped.
   > * Result: `self._port` stays at the fallback `15002`, and `_path_prefix` 
becomes `/app/driver:443` with `:443` left literally in the prefix.
   > 
   > So the intended port 443 is silently dropped. This is the documented 
standard param form (the class docstring advertises 
`sc://host[:port][/;params]`), so combining it with path routing is a natural 
usage. Without the trailing slash (`sc://gateway/app/driver:443;token=abc`) it 
works correctly (`last_segment='driver:443'`, port 443 extracted), which 
confirms the trailing `/` before `;` is the trigger.
   > 
   > Suggested fix: parse the last non-empty path segment (strip a trailing `/` 
before `rsplit`) so the port is recognized. Given the docstring already 
promises the `/;params` form, fixing the parser seems preferable to documenting 
the limitation.
   
   Thanks for the comments! Will make these changes after I get initial PR 
check passing.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to