[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/websocket f7d3fb5409 045/114: Fix issue with handling m
From: |
ELPA Syncer |
Subject: |
[elpa] externals/websocket f7d3fb5409 045/114: Fix issue with handling multibyte characters. |
Date: |
Wed, 15 Feb 2023 20:58:58 -0500 (EST) |
branch: externals/websocket
commit f7d3fb5409aed9f5cdb745f0e61a0c43c097588c
Author: Andrew Hyatt <ahyatt@gmail.com>
Commit: Andrew Hyatt <ahyatt@gmail.com>
Fix issue with handling multibyte characters.
Added new method `websocket-frame-text' to return the payload of a frame
as utf-8 text.
Added a test to make sure message masked aren't multibyte.
Changed the text in the functional test to multibyte to help test
against these kinds of issues.
---
websocket-functional-test.el | 26 +++++++++++++-------------
websocket-test.el | 3 +++
websocket.el | 23 +++++++++++++++++------
3 files changed, 33 insertions(+), 19 deletions(-)
diff --git a/websocket-functional-test.el b/websocket-functional-test.el
index e4470156db..97e21ce4c0 100644
--- a/websocket-functional-test.el
+++ b/websocket-functional-test.el
@@ -52,8 +52,8 @@
(websocket-open
"ws://127.0.0.1:9999"
:on-message (lambda (_websocket frame)
- (push (websocket-frame-payload frame) wstest-msgs)
- (message "ws frame: %S" (websocket-frame-payload frame))
+ (push (websocket-frame-text frame) wstest-msgs)
+ (message "ws frame: %S" (websocket-frame-text frame))
(error "Test error (expected)"))
:on-close (lambda (_websocket) (setq wstest-closed t))))
@@ -67,10 +67,10 @@
(assert (null wstest-msgs))
-(websocket-send-text wstest-ws "Hi!")
+(websocket-send-text wstest-ws "你好")
(sleep-for 0.1)
-(assert (equal (car wstest-msgs) "You said: Hi!"))
+(assert (equal (car wstest-msgs) "You said: 你好"))
(setf (websocket-on-error wstest-ws) (lambda (_ws _type _err)))
(websocket-send-text wstest-ws "Hi after error!")
(sleep-for 0.1)
@@ -104,8 +104,8 @@
:on-open (lambda (_websocket)
(message "Websocket opened"))
:on-message (lambda (_websocket frame)
- (push (websocket-frame-payload frame) wstest-msgs)
- (message "ws frame: %S" (websocket-frame-payload
frame)))
+ (push (websocket-frame-text frame) wstest-msgs)
+ (message "ws frame: %S" (websocket-frame-text frame)))
:on-close (lambda (_websocket)
(message "Websocket closed")
(setq wstest-closed t)))
@@ -131,24 +131,24 @@
:host 'local
:on-message (lambda (ws frame)
(message "Server received text!")
- (websocket-send-text ws
-
(websocket-frame-payload frame)))
+ (websocket-send-text
+ ws (websocket-frame-text frame)))
:on-open (lambda (_websocket) "Client connection opened!")
:on-close (lambda (_websocket)
(setq wstest-closed t)))))
-
(setq wstest-msgs nil
wstest-ws
(websocket-open
"ws://localhost:9998"
:on-message (lambda (_websocket frame)
- (push (websocket-frame-payload frame) wstest-msgs)
- (message "ws frame: %S" (websocket-frame-payload
frame)))))
+ (message "ws frame: %S" (websocket-frame-text frame))
+ (push
+ (websocket-frame-text frame) wstest-msgs))))
(assert (websocket-openp wstest-ws))
- (websocket-send-text wstest-ws "Hi to self!")
+ (websocket-send-text wstest-ws "你好")
(sleep-for 0.3)
- (assert (equal (car wstest-msgs) "Hi to self!"))
+ (assert (equal (car wstest-msgs) "你好"))
(websocket-server-close server-conn))
(assert wstest-closed)
(websocket-close wstest-ws)
diff --git a/websocket-test.el b/websocket-test.el
index ab6740d209..604eb87919 100644
--- a/websocket-test.el
+++ b/websocket-test.el
@@ -194,6 +194,9 @@
(should (equal '("ext1" "ext2; a=1")
(websocket-negotiated-extensions ws-with-extensions)))))
+(ert-deftest websocket-mask-is-unibyte ()
+ (should-not (multibyte-string-p (websocket-mask "\344\275\240\345\245\275"
"abcdef"))))
+
(ert-deftest websocket-create-headers ()
(let ((base-headers (concat "Host: www.example.com\r\n"
"Upgrade: websocket\r\n"
diff --git a/websocket.el b/websocket.el
index 8db83c2e6b..03f7d4d133 100644
--- a/websocket.el
+++ b/websocket.el
@@ -4,7 +4,7 @@
;; Author: Andrew Hyatt <ahyatt@gmail.com>
;; Keywords: Communication, Websocket, Server
-;; Version: 1.6
+;; Version: 1.7
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
@@ -279,14 +279,25 @@ many bytes were consumed from the string."
(defstruct websocket-frame opcode payload length completep)
+(defun websocket-frame-text (frame)
+ "Given FRAME, return the payload as a utf-8 encoded string."
+ (assert (websocket-frame-p frame))
+ (decode-coding-string (websocket-frame-payload frame) 'utf-8))
+
(defun websocket-mask (key data)
"Using string KEY, mask string DATA according to the RFC.
This is used to both mask and unmask data."
- (apply
- 'string
- (loop for b across data
- for i from 0 to (length data)
- collect (logxor (websocket-get-bytes (substring key (mod i 4)) 1)
b))))
+ ;; If we don't make the string unibyte here, a string of bytes that should be
+ ;; interpreted as a unibyte string will instead be interpreted as a multibyte
+ ;; string of the same length (for example, 6 multibyte chars for 你好 instead
+ ;; of the correct 6 unibyte chars, which would convert into 2 multibyte
+ ;; chars).
+ (string-make-unibyte (apply
+ 'string
+ (loop for b across data
+ for i from 0 to (length data)
+ collect
+ (logxor (websocket-get-bytes (substring key (mod
i 4)) 1) b)))))
(defun websocket-ensure-length (s n)
"Ensure the string S has at most N bytes.
- [elpa] externals/websocket 111febe203 020/114: Fix `websocket-version': update to 1.3, (continued)
- [elpa] externals/websocket 111febe203 020/114: Fix `websocket-version': update to 1.3, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 9aad2f754f 022/114: Add supports for <32 bit emacs., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket dba6893ec5 023/114: Bump version to 1.4, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 965fac0fe5 027/114: add markdown preview mode, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 49a93b2218 028/114: Merge pull request #39 from ancane/master, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 90b9f03da0 029/114: Correctly parse fragmented HTTP header, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 8299e57a4c 033/114: Function test improvements for Windows: SIGSTP, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 4f8ddb64bc 034/114: Merge pull request #43 from chwarr/func-test-windows-sigstp, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 7422064ea6 035/114: Add a way to specify websocket-server listen host, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 923e74d686 038/114: Merge pull request #40 from ilysym/fragmented-header, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket f7d3fb5409 045/114: Fix issue with handling multibyte characters.,
ELPA Syncer <=
- [elpa] externals/websocket ccbe93ac8b 049/114: Stop checking certs in functional test., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 33d0406901 057/114: Reflow function documentation., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 268a0726b8 062/114: execute handshake after process status moved to open, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket c045acb374 039/114: Add test for fragmented headers., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket f18bfea59b 043/114: Made functional tests compile cleanly., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 23ec19933d 050/114: Various idiomatic changes., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 99d3b3e695 053/114: need another sleep on my environment, ELPA Syncer, 2023/02/15
- [elpa] externals/websocket c193d6f867 058/114: Add ability for clients to pass custom headers., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 058e8f4696 059/114: Fix issue with missing \r\n when using custom headers., ELPA Syncer, 2023/02/15
- [elpa] externals/websocket 7d2adf2187 061/114: Update version to 1.9., ELPA Syncer, 2023/02/15