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."

Reply via email to