branch: externals/websocket
commit b7a1907b8c5cf9f8c0e680ceeb0b86e47a9965b9
Author: Andrew Hyatt <[email protected]>
Commit: Andrew Hyatt <[email protected]>
Add port number when non-default to Host header.
This is optional accordingo the RFC, but seems to be necessary for
connections to IPython.
---
websocket-test.el | 8 ++++++--
websocket.el | 53 +++++++++++++++++++++++++++++------------------------
2 files changed, 35 insertions(+), 26 deletions(-)
diff --git a/websocket-test.el b/websocket-test.el
index f9f06985f5..59e5aaa79b 100644
--- a/websocket-test.el
+++ b/websocket-test.el
@@ -211,7 +211,11 @@
(websocket-create-headers "ws://www.example.com/path"
"key" nil
'(("ext1" . ("a" "b=2"))
- ("ext2")))))))
+ ("ext2"))))))
+ (should
+ (string-match
+ "Host: www.example.com:123\r\n"
+ (websocket-create-headers "ws://www.example.com:123/path" "key" nil nil))))
(ert-deftest websocket-process-frame ()
(let* ((sent)
@@ -323,7 +327,7 @@
;; A frame should be four bytes, even for no-data pings.
(should (equal 2 (websocket-frame-length
(websocket-read-frame
- (websocket-encode-frame
+ (websocket-encode-frame
(make-websocket-frame :opcode 'ping :completep t) t))))))
(ert-deftest websocket-check ()
diff --git a/websocket.el b/websocket.el
index 1e1baa3690..f147383eb2 100644
--- a/websocket.el
+++ b/websocket.el
@@ -870,30 +870,35 @@ connection, which should be kept in order to pass to
(defun websocket-create-headers (url key protocol extensions)
"Create connections headers for the given URL, KEY, PROTOCOL and EXTENSIONS.
These are defined as in `websocket-open'."
- (format (concat "Host: %s\r\n"
- "Upgrade: websocket\r\n"
- "Connection: Upgrade\r\n"
- "Sec-WebSocket-Key: %s\r\n"
- "Sec-WebSocket-Version: 13\r\n"
- (when protocol
- (concat
- (mapconcat (lambda (protocol)
- (format "Sec-WebSocket-Protocol: %s"
protocol))
- protocol "\r\n")
- "\r\n"))
- (when extensions
- (format "Sec-WebSocket-Extensions: %s\r\n"
- (mapconcat
- (lambda (ext)
- (concat (car ext)
- (when (cdr ext) "; ")
- (when (cdr ext)
- (mapconcat 'identity (cdr ext) ";
"))))
- extensions ", ")))
- "\r\n")
- (url-host (url-generic-parse-url url))
- key
- protocol))
+ (let ((parsed-url (url-generic-parse-url url)))
+ (format (concat "Host: %s\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Key: %s\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ (when protocol
+ (concat
+ (mapconcat
+ (lambda (protocol)
+ (format "Sec-WebSocket-Protocol: %s" protocol))
+ protocol "\r\n")
+ "\r\n"))
+ (when extensions
+ (format "Sec-WebSocket-Extensions: %s\r\n"
+ (mapconcat
+ (lambda (ext)
+ (concat
+ (car ext)
+ (when (cdr ext) "; ")
+ (when (cdr ext)
+ (mapconcat 'identity (cdr ext) "; "))))
+ extensions ", ")))
+ "\r\n")
+ (if (url-port-if-non-default parsed-url)
+ (format "%s:%s" (url-host parsed-url) (url-port parsed-url))
+ (url-host parsed-url))
+ key
+ protocol)))
(defun websocket-get-server-response (websocket client-protocols
client-extensions)
"Get the websocket response from client WEBSOCKET."