branch: externals/websocket commit b7a1907b8c5cf9f8c0e680ceeb0b86e47a9965b9 Author: Andrew Hyatt <ahy...@gmail.com> Commit: Andrew Hyatt <ahy...@gmail.com>
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."