Re: [hybi] Several questions/proposals about WebSocket Close Status Codes
David Jarry <hybi@melnofil.fr> Sun, 30 January 2022 19:42 UTC
Return-Path: <hybi@melnofil.fr>
X-Original-To: hybi@ietfa.amsl.com
Delivered-To: hybi@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 9F21C3A1158 for <hybi@ietfa.amsl.com>; Sun, 30 Jan 2022 11:42:43 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.612
X-Spam-Level:
X-Spam-Status: No, score=-2.612 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, NICE_REPLY_A=-0.714, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id GYWJ7kugbLdi for <hybi@ietfa.amsl.com>; Sun, 30 Jan 2022 11:42:39 -0800 (PST)
Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::221]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 463A13A1157 for <hybi@ietf.org>; Sun, 30 Jan 2022 11:42:38 -0800 (PST)
Received: (Authenticated sender: hybi@melnofil.fr) by mail.gandi.net (Postfix) with ESMTPSA id ED558240005; Sun, 30 Jan 2022 19:42:33 +0000 (UTC)
Content-Type: multipart/alternative; boundary="------------XDhf8yBEYy0YGLGWGDjcoz7l"
Message-ID: <aa725cab-2bc0-8c17-936a-c29c3dca5ca7@melnofil.fr>
Date: Sun, 30 Jan 2022 20:42:33 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0
From: David Jarry <hybi@melnofil.fr>
To: Andy Green <andy@warmcat.com>, hybi@ietf.org
References: <f9ca533c-7cfb-9079-26c1-6f99eec529a2@melnofil.fr> <575a1e62-4058-1b56-8c09-62814dec3473@warmcat.com>
Content-Language: fr
In-Reply-To: <575a1e62-4058-1b56-8c09-62814dec3473@warmcat.com>
Archived-At: <https://mailarchive.ietf.org/arch/msg/hybi/kveqI5A5AlO8ZGT462BKXqoHPtM>
Subject: Re: [hybi] Several questions/proposals about WebSocket Close Status Codes
X-BeenThere: hybi@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Server-Initiated HTTP <hybi.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/hybi>, <mailto:hybi-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/hybi/>
List-Post: <mailto:hybi@ietf.org>
List-Help: <mailto:hybi-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/hybi>, <mailto:hybi-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sun, 30 Jan 2022 19:42:44 -0000
I/ My bad. So I figured out: * 1003 is an opcode error (1 instead of 2 or vice versa) * 1007 is an payload data error (like an UTF-8 encoding error) * Judging payload data is delegated to the subprotocol, which may have its own error handling system (and subprotocol should handle almost all errors), socode 1007 should not be used on a server that expects binary data (Opcode=2). I understand the rest (I generally agree, e.g. the sub-protocol should handle version issues). Thank you for your time. Le 30/01/2022 à 08:04, Andy Green a écrit : > > > On 1/30/22 06:07, David Jarry wrote: > >>> RFC : 1003 indicates that an endpoint is terminating the connection >>> because it has received a type of data it cannot accept (e.g., an >>> endpoint that understands only text data MAY send this if it >>> receives a binary message). >>> IANA : Unsupported Data. >>> >>> RFC : 1007 indicates that an endpoint is terminating the connection >>> because it has received data within a message that was not >>> consistent with the type of the message (e.g., non-UTF-8 data within >>> a text message). >>> IANA : Invalid frame payload data. >> >> I don't understand how to choose between these two codes: How does a >> server expecting UTF-8 text know the difference between binary input >> and non-UTF-8 input? > > In ws, messages come with an indication they are UTF-8 TEXT (started > with opcode 1) or BINARY (opcode 2). So "receives a binary message" > isn't an ambiguous thing in ws, the server will always know clearly if > he got the type he wasn't expecting. > >> It would be much simpler if one code corresponded to "I expect XML >> and I received JSON" (type error, encoding error, parsing error…) and >> if the other code corresponded to "I expect a JSON object ({}) and I >> received a JSON array ([])" (value error, precondition fail on data, >> wrong content…). > > It is simple since it tells you if it is BINARY or TEXT explicitly. > Ws doesn't attempt to define payload semantics so it's not the right > layer to define what's wrong with them. The server can send arbitrary > diagnostic payload in the CLOSE frame extra data to help with analysis. > >> So if a server expects UTF-8 text: >> >> * The first code is returned if UTF-8 decoding fails (it doesn't >> matter if the input is binary or a nearly UTF-8 text). >> * The second code is returned if the text uses Egyptian hieroglyphs >> when an English text was expected. > > First code is generally for "data it cannot accept", the example given > is the case it was sent the wrong one of BINARY or TEXT message. > > Second one is for if you see a TEXT message that violated the specific > requirement that it must contain valid UTF-8. It's written generally > but IIRC TEXT + UTF-8 is the only time ws talks about judging payload > contents themselves. > >> II/ >> >>> IANA 1014 : The server was acting as a gateway or proxy and >>> received an invalid response from the upstream server. This is >>> similar to 502 HTTP Status Code. >>> RFC : Status codes in the range 4000-4999 are reserved for private >>> use and thus can't be registered. Such codes can be used by prior >>> agreements between WebSocket applications. The interpretation of >>> these codes is undefined by this protocol. IANA : Reserved for >>> Private Use. >> >> Since the code 1014 admits the existence of gateway and proxy, >> shouldn't it be specified somewhere that the intermediate servers >> MUST pass without modifications any code in the range 4000-4999 that >> it does not understand, so that the agreement can be directly >> established between the end server and the end client (dispite of >> gateway and proxy)? > > It doesn't say that they shouldn't, so there is no conflict with doing > so. It would indeed be better if it did say they MUST. > >> III/ >> >> Unlike HTTP, communication is two-way, but many codes assume that >> there is a service, a server, and a client. For certain uses, it may >> be interesting to use the WebSocket protocol between two servers >> (peer to peer). For example if a server on a local network wants to >> communicate with an external server through a Firewall which only >> accepts port 80 in both directions, then WebSocket makes it possible >> to create sockets in both directions even through an HTTPd. >> Everything should be done to reduce the difference between a server >> and a client (once the connection is established, think of it like >> peers). > > I don't disagree with the observation, but it's like that because ws > was defined as an upgrade protocol from http, which has this schism > thoroughly baked in. > >>> IANA 1014 : The server was acting as a gateway or proxy and received >>> an invalid response from the upstream server. This is similar to 502 >>> HTTP Status Code. >> >> Must be "Gateway or Proxy Error"! Please authorize a client to send >> this code. I don't understand why a client is forbidden to be behind >> a gateway or a proxy. > > He's not "forbidden to be behind a gateway or proxy", he just isn't > given an explicit way to explain he's closing from shenanigans due to > that. > >>> IANA 1012 : Service Restart >> >> Must be "Restart"! Please authorize a client to send this code. Maybe >> the server will decide to keep certain things cached (unlike code >> 1000 where the server can destroy all its caches). > > Well, I guess it could be useful. > >> IV/ >> >> Proposals (codes for timeouts and version checks): >> >> Gateway or Proxy Timeout: >> The server was acting as a gateway or proxy and did not receive a >> timely response from the upstream server. This is similar to 504 HTTP >> Status Code. > > I guess if you have 1014, this is also useful. > >> Timeout: >> A generic status code that can be returned when a timeout has >> occurred, meaning that the purpose for which the connection was >> established was not been fulfilled (something took too long). > > Timeouts may not necessarily want to present at ws layer, eg, whatever > timed out might be retryable inside the ws connection session without > terminating and re-establishing it. So I think this is of limited use. > >> Deprecated: >> Please update. Even a client can send this code and try another >> server, a warning can be written in the server log. > > The idea of the subprotocol naming is to contain the necessary > versioning cleanly. > > https://datatracker.ietf.org/doc/html/rfc6455#section-1.9 > >> Not Implemented: >> I'm not updated.A client can reboot with backwards compatibility >> enabled or connect to another server. A server can treat this request >> as a 1012 code, except that the last request was not understood >> (e.g., the clientbrowser should reload the page, then the serveur >> send back the last message)! > > Unless I miss your point, again subprotocols are designed to absorb > this kind of problem (and allow the client to propose multiple > supported versions in one step). > > -Andy