mirror of
https://github.com/weechat/weechat.git
synced 2026-07-02 07:46:38 +02:00
relay: enable websocket extension "permessage-deflate" with "api" relay only
This commit is contained in:
@@ -207,7 +207,8 @@ relay_remote_network_check_auth (struct t_relay_remote *remote,
|
||||
|
||||
relay_websocket_parse_extensions (
|
||||
weechat_hashtable_get (http_resp->headers, "sec-websocket-extensions"),
|
||||
remote->ws_deflate);
|
||||
remote->ws_deflate,
|
||||
1); /* ws_deflate_allowed */
|
||||
|
||||
if (!accept_ok)
|
||||
{
|
||||
|
||||
@@ -1759,7 +1759,7 @@ relay_config_init ()
|
||||
relay_config_file, relay_config_section_network,
|
||||
"websocket_permessage_deflate", "boolean",
|
||||
N_("enable websocket extension \"permessage-deflate\" to compress "
|
||||
"websocket frames, with \"api\" and \"weechat\" protocols; "
|
||||
"websocket frames (\"api\" protocol only); "
|
||||
"if disabled, WeeChat (as server) will not enable "
|
||||
"permessage-deflate even if the client supports it, and when "
|
||||
"connecting to a remote WeeChat (api relay only), "
|
||||
|
||||
@@ -385,6 +385,10 @@ error:
|
||||
/*
|
||||
* Parses and saves a HTTP header in hashtable "headers".
|
||||
*
|
||||
* The parameter "ws_deflate_allowed" controls whether the websocket extension
|
||||
* "permessage-deflate" is allowed or not (it is allowed only with "api"
|
||||
* protocol).
|
||||
*
|
||||
* Returns:
|
||||
* 1: OK, header saved
|
||||
* 0: error: invalid format
|
||||
@@ -392,7 +396,8 @@ error:
|
||||
|
||||
int
|
||||
relay_http_parse_header (struct t_relay_http_request *request,
|
||||
const char *header)
|
||||
const char *header,
|
||||
int ws_deflate_allowed)
|
||||
{
|
||||
char *pos, *name, *name_lower, *error, **items;
|
||||
const char *ptr_value;
|
||||
@@ -465,7 +470,12 @@ relay_http_parse_header (struct t_relay_http_request *request,
|
||||
* extensions
|
||||
*/
|
||||
if (strcmp (name_lower, "sec-websocket-extensions") == 0)
|
||||
relay_websocket_parse_extensions (ptr_value, request->ws_deflate);
|
||||
{
|
||||
relay_websocket_parse_extensions (
|
||||
ptr_value,
|
||||
request->ws_deflate,
|
||||
ws_deflate_allowed);
|
||||
}
|
||||
|
||||
free (name);
|
||||
free (name_lower);
|
||||
@@ -891,7 +901,7 @@ void
|
||||
relay_http_recv (struct t_relay_client *client, const char *data)
|
||||
{
|
||||
char *new_partial, *pos;
|
||||
int length;
|
||||
int length, ws_deflate_allowed;
|
||||
|
||||
if (client->partial_message)
|
||||
{
|
||||
@@ -924,8 +934,11 @@ relay_http_recv (struct t_relay_client *client, const char *data)
|
||||
}
|
||||
else
|
||||
{
|
||||
ws_deflate_allowed = (client->protocol == RELAY_PROTOCOL_API) ?
|
||||
1 : 0;
|
||||
relay_http_parse_header (client->http_req,
|
||||
client->partial_message);
|
||||
client->partial_message,
|
||||
ws_deflate_allowed);
|
||||
}
|
||||
pos[0] = '\r';
|
||||
pos++;
|
||||
|
||||
@@ -301,7 +301,8 @@ relay_websocket_client_handshake_valid (struct t_relay_http_request *request)
|
||||
|
||||
void
|
||||
relay_websocket_parse_extensions (const char *extensions,
|
||||
struct t_relay_websocket_deflate *ws_deflate)
|
||||
struct t_relay_websocket_deflate *ws_deflate,
|
||||
int ws_deflate_allowed)
|
||||
{
|
||||
char **exts, **params, **items, *error;
|
||||
int i, j, num_exts, num_params, num_items;
|
||||
@@ -319,6 +320,7 @@ relay_websocket_parse_extensions (const char *extensions,
|
||||
params = weechat_string_split (exts[i], ";", " ", 0, 0, &num_params);
|
||||
if (params && (num_params >= 1)
|
||||
&& (strcmp (params[0], "permessage-deflate") == 0)
|
||||
&& ws_deflate_allowed
|
||||
&& (weechat_config_boolean (relay_config_network_websocket_permessage_deflate)))
|
||||
{
|
||||
ws_deflate->enabled = 1;
|
||||
|
||||
@@ -71,7 +71,8 @@ extern int relay_websocket_is_valid_http_get (enum t_relay_protocol protocol,
|
||||
const char *message);
|
||||
extern int relay_websocket_client_handshake_valid (struct t_relay_http_request *request);
|
||||
extern void relay_websocket_parse_extensions (const char *extensions,
|
||||
struct t_relay_websocket_deflate *ws_deflate);
|
||||
struct t_relay_websocket_deflate *ws_deflate,
|
||||
int ws_deflate_allowed);
|
||||
extern char *relay_websocket_build_handshake (struct t_relay_http_request *request);
|
||||
extern int relay_websocket_decode_frame (const unsigned char *buffer,
|
||||
unsigned long long length,
|
||||
|
||||
Reference in New Issue
Block a user