Add HTTP/HTTPS Fetch() API to redbean

You can now say the following in your redbean Lua code:

    status,headers,payload = Fetch("https://foo.example")

The following Lua APIs have been introduced:

  - Fetch(str) → str,{str:str},str
  - GetHttpReason(int) → str
  - GetHttpReason(int) → str
  - ProgramSslFetchVerify(bool)
  - ProgramSslClientVerify(bool)

The following flags have been introduced:

  - `-j` enables client SSL verification
  - `-k` disables Fetch() SSL verification
  - `-t INT` may now be passed a negative value for keepalive

Lua exceptions now invoke Cosmopolitan's garbage collector when
unwinding the stack. So it's now safe to use _gc() w/ Lua 𝔱𝔥𝔯𝔬𝔴

See #97
This commit is contained in:
Justine Tunney 2021-07-07 21:44:27 -07:00
parent 36b2710e1a
commit c89bc56f6a
35 changed files with 1611 additions and 591 deletions

View file

@ -720,11 +720,13 @@ syscon sol SOL_X25 262 0 0 0 0 0
syscon tcp TCP_NODELAY 1 1 1 1 1 1 # strong consensus for disabling nagle's algorithm; so be sure to disable it by turning this on
syscon tcp TCP_CORK 3 4 4 16 0 0 # nagle's algorithm strikes again; TCP_NOPUSH on BSD; be sure to turn it off; protip: mmap+writev vs. write+sendfile; see also /proc/sys/net/ipv4/tcp_autocorking; netbsd is 4 but not implemented
syscon tcp TCP_MAXSEG 2 2 2 2 2 0 # reduces tcp segment size; see also tcp offloading
syscon tcp TCP_FASTOPEN 23 0 0x0401 0 0 15 # reduces roundtrips; for listener; Linux 3.7+ (c. 2012) / or is windows it 0x22? /proc/sys/net/ipv4/tcp_fastopen TODO(jart): MSG_FASTOPEN; XNU sources say 261 but not sure if that's true
syscon tcp TCP_FASTOPEN 23 0 0x0401 0 0 15 # reduces roundtrips; for listener; Linux 3.7+ (c. 2012) / or is windows it 0x22? /proc/sys/net/ipv4/tcp_fastopen TODO(jart): MSG_FASTOPEN; XNU sources say 261 but not sure if that's true
syscon tcp TCP_FASTOPEN_CONNECT 30 0 0 0 0 0 # reduces roundtrips; for listener; Linux 3.7+ (c. 2012) / or is windows it 0x22? /proc/sys/net/ipv4/tcp_fastopen TODO(jart): MSG_FASTOPEN; XNU sources say 261 but not sure if that's true
syscon tcp TCP_KEEPIDLE 4 0 0x100 0 3 0 # keepalives
syscon tcp TCP_KEEPINTVL 5 0x101 0x200 0 5 0 # keepalives
syscon tcp TCP_KEEPCNT 6 0x102 0x400 0 6 0 # keepalives
syscon tcp TCP_SYNCNT 7 0 0 0 0 0 # how hard to syn packet the enemy
syscon tcp TCP_ULP 31 0 0 0 0 0 # setsockopt(sock, IPPROTO_TCP, TCP_ULP, "tls", 4)
syscon tcp TCP_COOKIE_TRANSACTIONS 15 0 0 0 0 0 # defense against the syn packets
syscon tcp TCP_LINGER2 8 0 0 0 0 0 # orphaned fin-wait-2 lifetime cf. net.ipv4.tcp_fin_timeout see cloudflare blog
syscon tcp TCP_NOTSENT_LOWAT 25 513 0 0 0 0 # limit unset byte queue

View file

@ -0,0 +1,2 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon tcp,TCP_FASTOPEN_CONNECT,30,0,0,0,0,0

View file

@ -0,0 +1,2 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon tcp,TCP_ULP,31,0,0,0,0,0

View file

@ -10,6 +10,7 @@ extern const long TCP_COOKIE_TRANSACTIONS;
extern const long TCP_CORK;
extern const long TCP_DEFER_ACCEPT;
extern const long TCP_FASTOPEN;
extern const long TCP_FASTOPEN_CONNECT;
extern const long TCP_INFO;
extern const long TCP_KEEPCNT;
extern const long TCP_KEEPIDLE;
@ -31,40 +32,43 @@ extern const long TCP_SYNCNT;
extern const long TCP_THIN_DUPACK;
extern const long TCP_THIN_LINEAR_TIMEOUTS;
extern const long TCP_TIMESTAMP;
extern const long TCP_ULP;
extern const long TCP_USER_TIMEOUT;
extern const long TCP_WINDOW_CLAMP;
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#define TCP_CC_INFO SYMBOLIC(TCP_CC_INFO)
#define TCP_CONGESTION SYMBOLIC(TCP_CONGESTION)
#define TCP_COOKIE_TRANSACTIONS SYMBOLIC(TCP_COOKIE_TRANSACTIONS)
#define TCP_CORK SYMBOLIC(TCP_CORK)
#define TCP_DEFER_ACCEPT SYMBOLIC(TCP_DEFER_ACCEPT)
#define TCP_FASTOPEN SYMBOLIC(TCP_FASTOPEN)
#define TCP_INFO SYMBOLIC(TCP_INFO)
#define TCP_KEEPCNT SYMBOLIC(TCP_KEEPCNT)
#define TCP_KEEPIDLE SYMBOLIC(TCP_KEEPIDLE)
#define TCP_KEEPINTVL SYMBOLIC(TCP_KEEPINTVL)
#define TCP_LINGER2 SYMBOLIC(TCP_LINGER2)
#define TCP_MAXSEG SYMBOLIC(TCP_MAXSEG)
#define TCP_MD5SIG SYMBOLIC(TCP_MD5SIG)
#define TCP_MD5SIG_MAXKEYLEN SYMBOLIC(TCP_MD5SIG_MAXKEYLEN)
#define TCP_NODELAY LITERALLY(1)
#define TCP_NOTSENT_LOWAT SYMBOLIC(TCP_NOTSENT_LOWAT)
#define TCP_QUEUE_SEQ SYMBOLIC(TCP_QUEUE_SEQ)
#define TCP_QUICKACK SYMBOLIC(TCP_QUICKACK)
#define TCP_REPAIR SYMBOLIC(TCP_REPAIR)
#define TCP_REPAIR_OPTIONS SYMBOLIC(TCP_REPAIR_OPTIONS)
#define TCP_REPAIR_QUEUE SYMBOLIC(TCP_REPAIR_QUEUE)
#define TCP_SAVED_SYN SYMBOLIC(TCP_SAVED_SYN)
#define TCP_SAVE_SYN SYMBOLIC(TCP_SAVE_SYN)
#define TCP_SYNCNT SYMBOLIC(TCP_SYNCNT)
#define TCP_THIN_DUPACK SYMBOLIC(TCP_THIN_DUPACK)
#define TCP_CC_INFO SYMBOLIC(TCP_CC_INFO)
#define TCP_CONGESTION SYMBOLIC(TCP_CONGESTION)
#define TCP_COOKIE_TRANSACTIONS SYMBOLIC(TCP_COOKIE_TRANSACTIONS)
#define TCP_CORK SYMBOLIC(TCP_CORK)
#define TCP_DEFER_ACCEPT SYMBOLIC(TCP_DEFER_ACCEPT)
#define TCP_FASTOPEN SYMBOLIC(TCP_FASTOPEN)
#define TCP_FASTOPEN_CONNECT SYMBOLIC(TCP_FASTOPEN_CONNECT)
#define TCP_INFO SYMBOLIC(TCP_INFO)
#define TCP_KEEPCNT SYMBOLIC(TCP_KEEPCNT)
#define TCP_KEEPIDLE SYMBOLIC(TCP_KEEPIDLE)
#define TCP_KEEPINTVL SYMBOLIC(TCP_KEEPINTVL)
#define TCP_LINGER2 SYMBOLIC(TCP_LINGER2)
#define TCP_MAXSEG SYMBOLIC(TCP_MAXSEG)
#define TCP_MD5SIG SYMBOLIC(TCP_MD5SIG)
#define TCP_MD5SIG_MAXKEYLEN SYMBOLIC(TCP_MD5SIG_MAXKEYLEN)
#define TCP_NODELAY LITERALLY(1)
#define TCP_NOTSENT_LOWAT SYMBOLIC(TCP_NOTSENT_LOWAT)
#define TCP_QUEUE_SEQ SYMBOLIC(TCP_QUEUE_SEQ)
#define TCP_QUICKACK SYMBOLIC(TCP_QUICKACK)
#define TCP_REPAIR SYMBOLIC(TCP_REPAIR)
#define TCP_REPAIR_OPTIONS SYMBOLIC(TCP_REPAIR_OPTIONS)
#define TCP_REPAIR_QUEUE SYMBOLIC(TCP_REPAIR_QUEUE)
#define TCP_SAVED_SYN SYMBOLIC(TCP_SAVED_SYN)
#define TCP_SAVE_SYN SYMBOLIC(TCP_SAVE_SYN)
#define TCP_SYNCNT SYMBOLIC(TCP_SYNCNT)
#define TCP_THIN_DUPACK SYMBOLIC(TCP_THIN_DUPACK)
#define TCP_THIN_LINEAR_TIMEOUTS SYMBOLIC(TCP_THIN_LINEAR_TIMEOUTS)
#define TCP_TIMESTAMP SYMBOLIC(TCP_TIMESTAMP)
#define TCP_USER_TIMEOUT SYMBOLIC(TCP_USER_TIMEOUT)
#define TCP_WINDOW_CLAMP SYMBOLIC(TCP_WINDOW_CLAMP)
#define TCP_TIMESTAMP SYMBOLIC(TCP_TIMESTAMP)
#define TCP_ULP SYMBOLIC(TCP_ULP)
#define TCP_USER_TIMEOUT SYMBOLIC(TCP_USER_TIMEOUT)
#define TCP_WINDOW_CLAMP SYMBOLIC(TCP_WINDOW_CLAMP)
#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_TCP_H_ */