11 Commits
0.1.1 ... 0.1.5

Author SHA1 Message Date
949af5c092 Re-exposing current-websocket.
Tag release 0.1.5.
2015-06-28 19:33:41 -07:00
44caad5ae9 Releasing version 0.1.4. 2015-04-18 11:44:46 -07:00
fa6ec7695a Passing in values to foreign-lambda* for UTF-8 validation instead of
using global variables.
2015-04-18 11:41:00 -07:00
081209bd2f Using size_t instead of int. 2015-04-18 11:36:35 -07:00
90b97f7d34 Fixing unmask to pass values into foreign-lambda* instead of using
global variables.
2015-04-18 11:21:18 -07:00
fde9c289cc Removing unused code. 2015-04-18 10:58:23 -07:00
7f0b9d2873 Removing bogus length check. 2015-04-18 10:57:27 -07:00
5816661ebf Flushing output after frame is sent. 2015-04-18 10:57:12 -07:00
946552f79c Fixing upgrade header check. 2015-04-18 10:44:44 -07:00
e812e3cbbe Removing reliance on C99 standard. 2014-10-22 09:05:37 -07:00
23cecce39d Requiring at least spiffy 5.3.1. 2014-10-22 06:51:47 -07:00
4 changed files with 20 additions and 62 deletions

View File

@@ -5,6 +5,6 @@
(license "BSD") (license "BSD")
(category web) (category web)
(author "Thomas Hintz") (author "Thomas Hintz")
(depends spiffy intarweb uri-common base64 simple-sha1 mailbox comparse) (depends (spiffy 5.3.1) intarweb uri-common base64 simple-sha1 mailbox comparse)
(files "websockets.setup" "websockets.meta" "websockets.release-info" "LICENSE" (files "websockets.setup" "websockets.meta" "websockets.release-info" "LICENSE"
"utf8-grammar.scm")) "utf8-grammar.scm"))

View File

@@ -5,3 +5,7 @@
(release "0.0.1") (release "0.0.1")
(release "0.1.0") (release "0.1.0")
(release "0.1.1") (release "0.1.1")
(release "0.1.2")
(release "0.1.3")
(release "0.1.4")
(release "0.1.5")

View File

@@ -8,7 +8,7 @@
; high level API ; high level API
with-websocket with-concurrent-websocket with-websocket with-concurrent-websocket
send-message receive-message send-message receive-message current-websocket
; low level API ; low level API
;; send-frame read-frame read-frame-payload ;; send-frame read-frame read-frame-payload
@@ -166,6 +166,7 @@
outbound-port) outbound-port)
(write-string data len outbound-port) (write-string data len outbound-port)
(flush-output (response-port (current-response)))
#t)) #t))
(define (send-message data #!optional (optype 'text) (ws (current-websocket))) (define (send-message data #!optional (optype 'text) (ws (current-websocket)))
@@ -182,35 +183,28 @@
(u8vector-set! tmaskkey 1 (vector-ref frame-masking-key 1)) (u8vector-set! tmaskkey 1 (vector-ref frame-masking-key 1))
(u8vector-set! tmaskkey 2 (vector-ref frame-masking-key 2)) (u8vector-set! tmaskkey 2 (vector-ref frame-masking-key 2))
(u8vector-set! tmaskkey 3 (vector-ref frame-masking-key 3)) (u8vector-set! tmaskkey 3 (vector-ref frame-masking-key 3))
(define-external wsmaskkey blob (u8vector->blob/shared tmaskkey))
(define-external wslen int len) ((foreign-lambda* void ((blob wsmaskkey) (size_t wslen) (scheme-pointer wsv))
; TODO handle -1
(define-external wsv scheme-pointer payload)
((foreign-lambda* void ()
" "
if (wslen > UINT_MAX) { return -1; }
const unsigned char* maskkey2 = wsmaskkey; const unsigned char* maskkey2 = wsmaskkey;
const unsigned int kd = *(unsigned int*)maskkey2; const unsigned int kd = *(unsigned int*)maskkey2;
const unsigned char* __restrict kb = maskkey2; const unsigned char* __restrict kb = maskkey2;
for (int i = wslen >> 2; i != 0; --i) size_t i;
for (i = wslen >> 2; i != 0; --i)
{ {
*((unsigned int*)wsv) ^= kd; *((unsigned int*)wsv) ^= kd;
wsv += 4; wsv += 4;
} }
const int rem = wslen & 3; const size_t rem = wslen & 3;
for (int i = 0; i < rem; ++i) for (i = 0; i < rem; ++i)
{ {
*((unsigned int*)wsv++) ^= kb[i]; *((unsigned int*)wsv++) ^= kb[i];
} }
" "
)) ) (u8vector->blob/shared tmaskkey) len payload)
payload) payload)
(define (unmask fragment) (define (unmask fragment)
@@ -226,46 +220,7 @@
(define (read-frame-payload inbound-port frame-payload-length) (define (read-frame-payload inbound-port frame-payload-length)
(let ((masked-data (make-string frame-payload-length))) (let ((masked-data (make-string frame-payload-length)))
(read-string! frame-payload-length masked-data inbound-port) (read-string! frame-payload-length masked-data inbound-port)
masked-data) masked-data))
;; (let* ((masked-data (make-string frame-payload-length)))
;; (read-string! frame-payload-length masked-data inbound-port)
;; (define tmaskkey (make-u8vector 4 #f #t #t))
;; (u8vector-set! tmaskkey 0 (vector-ref frame-masking-key 0))
;; (u8vector-set! tmaskkey 1 (vector-ref frame-masking-key 1))
;; (u8vector-set! tmaskkey 2 (vector-ref frame-masking-key 2))
;; (u8vector-set! tmaskkey 3 (vector-ref frame-masking-key 3))
;; (define-external wsmaskkey blob (u8vector->blob/shared tmaskkey))
;; (define-external wslen int frame-payload-length)
;; (define-external wsv scheme-pointer masked-data)
;; (if frame-masked
;; (begin
;; ((foreign-lambda* void ()
;; "
;; const unsigned char* maskkey2 = wsmaskkey;
;; const unsigned int kd = *(unsigned int*)maskkey2;
;; const unsigned char* __restrict kb = maskkey2;
;; for (int i = wslen >> 2; i != 0; --i)
;; {
;; *((unsigned int*)wsv) ^= kd;
;; wsv += 4;
;; }
;; const int rem = wslen & 3;
;; for (int i = 0; i < rem; ++i)
;; {
;; *((unsigned int*)wsv++) ^= kb[i];
;; }
;; "
;; ))
;; masked-data)
;; masked-data))
)
(define (read-frame total-size ws) (define (read-frame total-size ws)
(let* ((inbound-port (websocket-inbound-port ws)) (let* ((inbound-port (websocket-inbound-port ws))
@@ -336,14 +291,13 @@
; Try to validate as an ascii string first. Its essentially ; Try to validate as an ascii string first. Its essentially
; free, doesn't generate garbage and is many, many times ; free, doesn't generate garbage and is many, many times
; faster than the general purpose validator. ; faster than the general purpose validator.
(define-external ws_utlen int len)
(define-external ws_uts scheme-pointer s)
(= 1 (= 1
((foreign-lambda* int () ((foreign-lambda* int ((size_t ws_utlen) (scheme-pointer ws_uts))
" "
if (ws_utlen > UINT_MAX) { return -1; } if (ws_utlen > UINT_MAX) { return -1; }
for (int i = ws_utlen; i != 0; --i) int i;
for (i = ws_utlen; i != 0; --i)
{ {
if (*((unsigned char*)ws_uts++) > 127) if (*((unsigned char*)ws_uts++) > 127)
{ {
@@ -352,7 +306,7 @@
} }
C_return(1); C_return(1);
")))) ") len s)))
(parse utf8-string (->parser-input s)))) (parse utf8-string (->parser-input s))))
(define (close-code->integer s) (define (close-code->integer s)
@@ -568,7 +522,7 @@
"ping thread"))) "ping thread")))
; make sure the request meets the spec for websockets ; make sure the request meets the spec for websockets
(cond ((not (and (eq? (header-value 'connection headers #f) 'upgrade) (cond ((not (and (member 'upgrade (header-values 'connection headers))
(string-ci= (car (header-value 'upgrade headers '(""))) "websocket"))) (string-ci= (car (header-value 'upgrade headers '(""))) "websocket")))
(signal (make-websocket-exception (signal (make-websocket-exception
(make-property-condition 'missing-upgrade-header)))) (make-property-condition 'missing-upgrade-header))))

View File

@@ -6,4 +6,4 @@
(install-extension 'websockets (install-extension 'websockets
'("websockets.so" "websockets.import.so") '("websockets.so" "websockets.import.so")
`((version "0.1.1"))) `((version "0.1.5")))