Skip to content

Commit de47e73

Browse files
committed
Inflight
1 parent fe31e27 commit de47e73

File tree

5 files changed

+64
-5
lines changed

5 files changed

+64
-5
lines changed

boringssl

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 251b5169fd44345f455438312ec4e18ae07fd58c

lsquic

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit c163433496b0a8fd2f2df0cec84dd4445517f3d5

lsquic.asd

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@
1313
:depends-on (:cffi
1414
:bordeaux-threads
1515
:static-vectors
16-
:weird-pointers))
16+
:weird-pointers
17+
:usocket))

src/http3.lisp

+37-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@
2828
(defclass http3-client ()
2929
((engine-version :initarg :quic-version :initform (error "You are required to supply a QUIC protocol version string"))
3030
(engine-settings :initform (safe-foreign-alloc '(:struct lsquic-engine-settings)))
31-
(engine-api :initform (safe-foreign-alloc '(:struct lsquic-engine-api)))))
31+
(engine-api :initform (safe-foreign-alloc '(:struct lsquic-engine-api)))
32+
(engine :accessor engine)
33+
(host :initarg :host :initform (error "You must supply a host to connect to"))
34+
(port :initarg :host :initform 443)
35+
(quic-socket)
36+
(quic-conn)
37+
(log-level :initarg :log-level :initform "debug")))
3238

3339
;; TODO: the `lsquic-str2ver` doesn't work. It signals an error
3440
;; because the return value doesn't cast back to what the enum was
@@ -51,13 +57,13 @@
5157

5258
(defmacro check-null-p (sym)
5359
`(when (cffi:null-pointer-p ,sym)
54-
(error 'library-error :slot-name ,sym)))
60+
(error 'library-error-null-p :slot-name ,sym)))
5561

5662
(defmethod initialize-instance :after ((client http3-client) &key)
5763
(unless already-lsquic-global-init
5864
(setf already-lsquic-global-init t)
5965
(lsquic-global-init LSQUIC-GLOBAL-CLIENT))
60-
(with-slots (engine-settings engine-version engine-api) client
66+
(with-slots (engine-settings engine-version engine-api log-level) client
6167
(check-null-p engine-settings)
6268
(check-null-p engine-api)
6369
(lsquic-engine-init-settings engine-settings LSENG-HTTP)
@@ -70,17 +76,44 @@
7076
(setf es-versions (logior es-versions (ash 1 (str->quic-version engine-version))))
7177
(when (not (eq 0 (lsquic-engine-check-settings engine-settings LSENG-HTTP errbuf bufsize)))
7278
(error 'invalid-settings))
79+
(with-foreign-string (ll log-level)
80+
(lsquic-set-log-level ll))
7381
(lsquic-logger-init logger-if (weird-pointers:save :nil) (foreign-enum-value 'lsquic-logger-timestamp-style :LLTS-HHMMSSUS))
7482
(with-foreign-slots ((ea-settings ea-packets-out ea-packets-out-ctx ea-stream-if ea-stream-if-ctx) engine-api (:struct lsquic-engine-api))
7583
(setf ea-settings engine-settings)
7684
(setf ea-stream-if client-callbacks)
7785
(setf ea-stream-if-ctx (weird-pointers:save client))
78-
;(setf ea-packets-out (callback cb-packets-out))
86+
(setf ea-packets-out (callback cb-packets-out))
7987
(setf ea-packets-out-ctx (weird-pointers:save client)))
8088
(let ((engine (lsquic-engine-new LSENG-HTTP engine-api)))
89+
(format t "~A~%" engine)
8190
(check-null-p engine)))))))
8291

8392
(defmethod close-client ((client http3-client))
8493
(with-slots (engine-settings engine-api) client
8594
(foreign-free engine-settings)
8695
(foreign-free engine-api)))
96+
97+
98+
;; lsquic_conn_t *
99+
;; lsquic_engine_connect (lsquic_engine_t *, enum lsquic_version,
100+
;; const struct sockaddr *local_sa,
101+
;; const struct sockaddr *peer_sa,
102+
;; void *peer_ctx, lsquic_conn_ctx_t *conn_ctx,
103+
;; const char *hostname, unsigned short base_plpmtu,
104+
;; const unsigned char *sess_resume, size_t sess_resume_len,
105+
;; /** Resumption token: optional */
106+
;; const unsigned char *token, size_t token_sz);
107+
108+
(defmethod quic-connect ((client http3-client))
109+
(with-slots (host port engine quic-socket quic-conn engine-version) client
110+
(with-pointer-to-int (version (str->quic-version engine-version))
111+
(let* ((peer-sa (get-peer-address-for-host host))
112+
(socket (create-udp-socket host :port 443))
113+
(conn (lsquic-engine-connect engine
114+
version
115+
)))
116+
(check-null-p engine)
117+
(setf quic-socket socket)
118+
(setf quic-conn conn)))))
119+

src/sockets.lisp

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(in-package :lsquic)
2+
3+
4+
(defun get-peer-address-for-host (host)
5+
(let ((addrs (multiple-value-list (sb-bsd-sockets:get-host-by-name host))))
6+
(loop for addr in addrs
7+
when (sb-bsd-sockets:host-ent-address addr)
8+
collect addr)))
9+
10+
(defun parse-ip-from-string (ip delimiter byte-spec &optional (radix 10))
11+
(map 'vector (lambda (octet)
12+
(ldb byte-spec (parse-integer octet :radix radix)))
13+
(split-sequence:split-sequence delimiter ip)))
14+
15+
(defun ip-to-byte-array (ip)
16+
(parse-ip-from-string ip #\. (byte 8 0)))
17+
18+
19+
(defun create-udp-socket (host &key (port 443))
20+
(let ((socket (make-instance 'sb-bsd-sockets:inet-socket :type :datagram :protocol :udp))
21+
(addr (nth 0 (get-peer-address-for-host host))))
22+
(sb-bsd-sockets:socket-connect socket (sb-bsd-sockets:host-ent-address addr) port))
23+

0 commit comments

Comments
 (0)