From: Adrián Arroyo Calle Date: Sat, 19 Mar 2022 21:53:24 +0000 (+0100) Subject: http_open/3 with method option X-Git-Tag: v0.9.1~87^2~3 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=3acbe2a418aa0813c3a7c6073f906fc022f8a285;p=scryer-prolog.git http_open/3 with method option --- diff --git a/Cargo.lock b/Cargo.lock index ac766ca5..2ad2bd17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + [[package]] name = "cc" version = "1.0.73" @@ -219,7 +225,7 @@ dependencies = [ "crossterm_winapi", "lazy_static", "libc", - "mio", + "mio 0.6.23", "parking_lot 0.10.2", "signal-hook", "winapi 0.3.9", @@ -294,9 +300,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "ed25519" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed12bbf7b5312f8da1c2722bc06d8c6b12c2d86a7fb35a194c7f3e6fc2bbe39" +checksum = "3d5c4b5e5959dc2c2b89918d8e2cc40fcdd623cef026ed09d2f0ee05199dc8e4" dependencies = [ "signature", ] @@ -355,15 +361,21 @@ dependencies = [ [[package]] name = "fd-lock" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02ecad9808e0596f8956d14f7fa868f996290bd01c8d7329d6e5bc2bb76adf8f" +checksum = "46e245f4c8ec30c6415c56cb132c07e69e74f1942f6b4a4061da748b49f486ca" dependencies = [ "cfg-if 1.0.0", "rustix", - "windows-sys", + "windows-sys 0.30.0", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foreign-types" version = "0.3.2" @@ -411,6 +423,45 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -431,13 +482,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -458,8 +509,8 @@ checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" dependencies = [ "proc-macro-hack", "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", ] [[package]] @@ -472,6 +523,25 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "h2" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.11.2" @@ -487,6 +557,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hostname" version = "0.3.1" @@ -512,6 +591,77 @@ dependencies = [ "syn 0.15.44", ] +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "indexmap" version = "1.8.0" @@ -533,9 +683,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" +checksum = "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504" [[package]] name = "iovec" @@ -617,9 +767,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5c14e80759d0939d013e6ca49930e59fc53dd8e5009132f76240c179380c09" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" [[package]] name = "libsodium-sys" @@ -659,9 +809,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ "cfg-if 1.0.0", ] @@ -732,12 +882,26 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow", + "miow 0.2.2", "net2", "slab", "winapi 0.2.8", ] +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow 0.3.7", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + [[package]] name = "miow" version = "0.2.2" @@ -750,6 +914,15 @@ dependencies = [ "ws2_32-sys", ] +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "modular-bitfield" version = "0.11.2" @@ -765,15 +938,15 @@ version = "0.11.2" source = "git+https://github.com/mthom/modular-bitfield#213535c684af277563678179d8496f11b84a283f" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "09bf6f32a3afefd0b587ee42ed19acd945c6d1f3b5424040f50b2f24ab16be77" dependencies = [ "lazy_static", "libc", @@ -839,6 +1012,15 @@ dependencies = [ "memoffset", ] +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -893,6 +1075,16 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "once_cell" version = "1.10.0" @@ -927,9 +1119,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.17.0+1.1.1m" +version = "111.18.0+1.1.1n" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d6a336abd10814198f66e2a91ccd7336611f30334119ca8ce300536666fcf4" +checksum = "7897a926e1e8d00219127dc020130eca4292e5ca666dd592480d72c3eca2ff6c" dependencies = [ "cc", ] @@ -978,6 +1170,16 @@ dependencies = [ "parking_lot_core 0.8.5", ] +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api 0.4.6", + "parking_lot_core 0.9.1", +] + [[package]] name = "parking_lot_core" version = "0.7.2" @@ -1001,11 +1203,24 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.2.11", + "redox_syscall 0.2.12", "smallvec", "winapi 0.3.9", ] +[[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.12", + "smallvec", + "windows-sys 0.32.0", +] + [[package]] name = "phf" version = "0.7.24" @@ -1066,8 +1281,8 @@ dependencies = [ "phf_shared 0.9.0", "proc-macro-hack", "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", ] [[package]] @@ -1088,6 +1303,18 @@ dependencies = [ "siphasher 0.3.10", ] +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.24" @@ -1168,9 +1395,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" dependencies = [ "proc-macro2 1.0.36", ] @@ -1338,21 +1565,22 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" dependencies = [ "getrandom", - "redox_syscall 0.2.11", + "redox_syscall 0.2.12", + "thiserror", ] [[package]] @@ -1424,9 +1652,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.33.4" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7ec6a44fba95d21fa522760c03c16ca5ee95cebb6e4ef579cab3e6d7ba6c06" +checksum = "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e" dependencies = [ "bitflags", "errno", @@ -1512,6 +1740,8 @@ dependencies = [ "fxhash", "git-version", "hostname", + "hyper", + "hyper-tls", "indexmap", "lazy_static", "lexical", @@ -1525,7 +1755,7 @@ dependencies = [ "phf 0.9.0", "predicates-core", "proc-macro2 1.0.36", - "quote 1.0.15", + "quote 1.0.17", "ref_thread_local", "ring", "ripemd160", @@ -1542,9 +1772,10 @@ dependencies = [ "static_assertions", "strum", "strum_macros", - "syn 1.0.88", + "syn 1.0.90", "to-syn-value", "to-syn-value_derive", + "tokio", "walkdir", ] @@ -1594,8 +1825,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", ] [[package]] @@ -1627,8 +1858,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", ] [[package]] @@ -1651,7 +1882,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" dependencies = [ "libc", - "mio", + "mio 0.6.23", "signal-hook-registry", ] @@ -1705,6 +1936,16 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "sodiumoxide" version = "0.2.7" @@ -1759,7 +2000,7 @@ dependencies = [ "phf_generator 0.7.24", "phf_shared 0.7.24", "proc-macro2 1.0.36", - "quote 1.0.15", + "quote 1.0.17", "string_cache_shared", ] @@ -1783,9 +2024,9 @@ checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" dependencies = [ "heck", "proc-macro2 1.0.36", - "quote 1.0.15", + "quote 1.0.17", "rustversion", - "syn 1.0.88", + "syn 1.0.90", ] [[package]] @@ -1807,12 +2048,12 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.88" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd69e719f31e88618baa1eaa6ee2de5c9a1c004f1e9ecdb58e8352a13f20a01" +checksum = "704df27628939572cd88d33f171cd6f896f4eaca85252c6e0a72d8d8287ee86f" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", + "quote 1.0.17", "unicode-xid 0.2.2", ] @@ -1825,16 +2066,16 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall 0.2.11", + "redox_syscall 0.2.12", "remove_dir_all", "winapi 0.3.9", ] [[package]] name = "tendril" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" dependencies = [ "futf", "mac", @@ -1847,6 +2088,26 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2 1.0.36", + "quote 1.0.17", + "syn 1.0.90", +] + [[package]] name = "time" version = "0.1.43" @@ -1863,7 +2124,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45dcb7b4108a4793bdd74aa3714296c6eaf43663edf73fa8625d0d7621e68447" dependencies = [ - "syn 1.0.88", + "syn 1.0.90", "to-syn-value_derive", ] @@ -1874,10 +2135,97 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd4fdec6de01b568c1d3721c9d46a352623c536cd55a8a5acfefb63d1fccccbc" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", +] + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio 0.8.2", + "num_cpus", + "once_cell", + "parking_lot 0.12.0", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi 0.3.9", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2 1.0.36", + "quote 1.0.17", + "syn 1.0.90", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +dependencies = [ + "lazy_static", ] +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "typenum" version = "1.15.0" @@ -1958,12 +2306,28 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.79" @@ -1984,8 +2348,8 @@ dependencies = [ "lazy_static", "log", "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", "wasm-bindgen-shared", ] @@ -1995,7 +2359,7 @@ version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ - "quote 1.0.15", + "quote 1.0.17", "wasm-bindgen-macro-support", ] @@ -2006,8 +2370,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ "proc-macro2 1.0.36", - "quote 1.0.15", - "syn 1.0.88", + "quote 1.0.17", + "syn 1.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2077,11 +2441,24 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "030b7ff91626e57a05ca64a07c481973cbb2db774e4852c9c7ca342408c6a99a" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.30.0", + "windows_i686_gnu 0.30.0", + "windows_i686_msvc 0.30.0", + "windows_x86_64_gnu 0.30.0", + "windows_x86_64_msvc 0.30.0", +] + +[[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc 0.32.0", + "windows_i686_gnu 0.32.0", + "windows_i686_msvc 0.32.0", + "windows_x86_64_gnu 0.32.0", + "windows_x86_64_msvc 0.32.0", ] [[package]] @@ -2090,30 +2467,60 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + [[package]] name = "windows_i686_gnu" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + [[package]] name = "windows_i686_msvc" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + [[package]] name = "windows_x86_64_gnu" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + [[package]] name = "windows_x86_64_msvc" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + [[package]] name = "ws2_32-sys" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 62ef48f2..7ed79773 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,6 +65,9 @@ sodiumoxide = "0.2.6" static_assertions = "1.1.0" slice-deque = "0.3.0" ryu = "1.0.9" +hyper = { version = "0.14", features = ["full"] } +hyper-tls = "0.5.0" +tokio = { version = "1", features = ["full"] } [dev-dependencies] assert_cmd = "1.0.3" diff --git a/build/instructions_template.rs b/build/instructions_template.rs index 7924faa2..766ece84 100644 --- a/build/instructions_template.rs +++ b/build/instructions_template.rs @@ -540,6 +540,8 @@ enum SystemClauseType { CpuNow, #[strum_discriminants(strum(props(Arity = "2", Name = "$det_length_rundown")))] DeterministicLengthRundown, + #[strum_discriminants(strum(props(Arity = "3", Name = "$http_open")))] + HttpOpen, REPL(REPLCodePtr), } @@ -1661,6 +1663,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::CallMaybe(_) | &Instruction::CallCpuNow(_) | &Instruction::CallDeterministicLengthRundown(_) | + &Instruction::CallHttpOpen(_) | &Instruction::CallCurrentTime(_) | &Instruction::CallQuotedToken(_) | &Instruction::CallReadTermFromChars(_) | @@ -1864,6 +1867,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::ExecuteMaybe(_) | &Instruction::ExecuteCpuNow(_) | &Instruction::ExecuteDeterministicLengthRundown(_) | + &Instruction::ExecuteHttpOpen(_) | &Instruction::ExecuteCurrentTime(_) | &Instruction::ExecuteQuotedToken(_) | &Instruction::ExecuteReadTermFromChars(_) | diff --git a/src/arena.rs b/src/arena.rs index 8824ede8..f7490b66 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -37,6 +37,7 @@ pub enum ArenaHeaderTag { OutputFileStream = 0b10100, NamedTcpStream = 0b011100, NamedTlsStream = 0b100000, + NamedHttpClientStream = 0b100001, ReadlineStream = 0b110000, StaticStringStream = 0b110100, ByteStream = 0b111000, @@ -412,6 +413,9 @@ unsafe fn drop_slab_in_place(value: &mut AllocSlab) { ArenaHeaderTag::NamedTlsStream => { ptr::drop_in_place(value.payload_offset::>>()); } + ArenaHeaderTag::NamedHttpClientStream => { + ptr::drop_in_place(value.payload_offset::>>()); + } ArenaHeaderTag::ReadlineStream => { ptr::drop_in_place(value.payload_offset::>()); } diff --git a/src/lib/http/http_open.pl b/src/lib/http/http_open.pl index 6d720f1b..73b15338 100644 --- a/src/lib/http/http_open.pl +++ b/src/lib/http/http_open.pl @@ -1,5 +1,5 @@ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Written 2020, 2021 by Markus Triska (triska@metalevel.at) + Written 2022 by Adrián Arroyo Calle (adrian.arroyocalle@gmail.com) Part of Scryer Prolog. http_open(+Address, -Stream, +Options) @@ -7,12 +7,7 @@ Yields Stream to read the body of an HTTP reply from Address. Address is a list of characters, and includes the method. Both HTTP - and HTTPS are supported. Redirects are followed. - - Currently, Options must be the empty list. Options may be - added in the future to give more control over the connection. - - We use HTTP/1.0 until we can read chunked transfer-encoding. + and HTTPS are supported. Example: @@ -23,62 +18,21 @@ :- module(http_open, [http_open/3]). -:- use_module(library(sockets)). -:- use_module(library(error)). -:- use_module(library(format)). -:- use_module(library(charsio)). -:- use_module(library(dcgs)). -:- use_module(library(lists), [member/2]). -:- use_module(library(tls)). - -http_open(Address, Stream, Options) :- - must_be(list, Options), - must_be(list, Address), - once(phrase((seq(SchemeCs), "://", seq(Rest)), Address)), - atom_chars(Scheme, SchemeCs), - chars_host_url(Rest, Host, URL), - connect(Scheme, Host, Stream0), - format(Stream0, "\ -GET ~s HTTP/1.0\r\n\ -Host: ~w\r\n\ -User-Agent: Scryer Prolog\r\n\ -Connection: close\r\n\r\n\ -", [URL,Host]), - read_line_to_chars(Stream0, StatusLine, []), - once(phrase(("HTTP/1.",(['0']|['1'])," ",[D1]), StatusLine, _)), - read_header_lines(Stream0, HeaderLines), - handle_response(D1, HeaderLines, Stream0, Stream). - -handle_response('2', _, Stream, Stream). % ok -handle_response('3', HeaderLines, Stream0, Stream) :- % redirect - close(Stream0), - once((member(Line, HeaderLines), - phrase(("Location: ",seq(Location),"\r\n"), Line))), - http_open(Location, Stream, []). - -% Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF - -read_header_lines(Stream, Hs) :- - read_line_to_chars(Stream, Cs, []), - ( Cs == "" -> Hs = [] - ; Cs == "\r\n" -> Hs = [] - ; Hs = [Cs|Rest], - read_header_lines(Stream, Rest) - ). +:- use_module(library(lists)). -chars_host_url(Cs, Host, [/|Us]) :- - ( phrase((seq(Hs),"/",seq(Us)), Cs) -> - true - ; Hs = Cs, - Us = [] - ), - atom_chars(Host, Hs). +http_open(Address, Response, Options) :- + parse_http_options(Options, OptionValues), + ( member(method(Method), OptionValues) -> true; Method = get), + '$http_open'(Address, Response, Method). -connect(https, Host, Stream) :- - socket_client_open(Host:443, Stream0, []), - atom_chars(Host, HostChars), - tls_client_context(Context, [hostname(HostChars)]), - tls_client_negotiate(Context, Stream0, Stream). -connect(http, Host, Stream) :- - socket_client_open(Host:80, Stream, []). +parse_http_options(Options, OptionValues) :- + maplist(parse_http_options_, Options, OptionValues). +parse_http_options_(method(Method), method(Method)) :- + ( var(Method) -> + throw(error(instantiation_error, http_open/3)) + ; + lists:member(Method, [get, post, put, delete, patch, head]) -> true + ; + throw(error(domain_error(http_option, method(Method)), _)) + ). \ No newline at end of file diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index 0a110681..9320ac5d 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -4127,6 +4127,14 @@ impl Machine { try_or_throw!(self.machine_st, self.det_length_rundown()); step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } + &Instruction::CallHttpOpen(_) => { + self.http_open(); + step_or_fail!(self, self.machine_st.p += 1); + } + &Instruction::ExecuteHttpOpen(_) => { + self.http_open(); + step_or_fail!(self, self.machine_st.p = self.machine_st.cp); + } &Instruction::CallCurrentTime(_) => { self.current_time(); step_or_fail!(self, self.machine_st.p += 1); diff --git a/src/machine/mock_wam.rs b/src/machine/mock_wam.rs index 0b4923da..138dbdaf 100644 --- a/src/machine/mock_wam.rs +++ b/src/machine/mock_wam.rs @@ -224,6 +224,11 @@ impl Machine { let user_output = Stream::from_owned_string("".to_owned(), &mut machine_st.arena); let user_error = Stream::stderr(&mut machine_st.arena); + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + let mut wam = Machine { machine_st, indices: IndexStore::new(), @@ -232,6 +237,7 @@ impl Machine { user_output, user_error, load_contexts: vec![], + runtime }; let mut lib_path = current_dir(); diff --git a/src/machine/mod.rs b/src/machine/mod.rs index f69426b6..074e8f42 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -48,6 +48,7 @@ use std::cmp::Ordering; use std::env; use std::path::PathBuf; use std::sync::atomic::AtomicBool; +use tokio::runtime::Runtime; lazy_static! { pub static ref INTERRUPT: AtomicBool = AtomicBool::new(false); @@ -62,6 +63,7 @@ pub struct Machine { pub(super) user_output: Stream, pub(super) user_error: Stream, pub(super) load_contexts: Vec, + pub(super) runtime: Runtime, } #[derive(Debug)] @@ -405,6 +407,11 @@ impl Machine { let user_output = Stream::stdout(&mut machine_st.arena); let user_error = Stream::stderr(&mut machine_st.arena); + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + let mut wam = Machine { machine_st, indices: IndexStore::new(), @@ -413,6 +420,7 @@ impl Machine { user_output, user_error, load_contexts: vec![], + runtime, }; let mut lib_path = current_dir(); diff --git a/src/machine/streams.rs b/src/machine/streams.rs index f305ae04..a0dc83f5 100644 --- a/src/machine/streams.rs +++ b/src/machine/streams.rs @@ -15,10 +15,11 @@ pub use modular_bitfield::prelude::*; use std::cmp::Ordering; use std::error::Error; use std::fmt; +use std::fmt::Debug; use std::fs::{File, OpenOptions}; use std::hash::{Hash}; use std::io; -use std::io::{Cursor, ErrorKind, Read, Seek, SeekFrom, Write}; +use std::io::{BufRead, Cursor, ErrorKind, Read, Seek, SeekFrom, Write}; use std::mem; use std::net::{TcpStream, Shutdown}; use std::ops::{Deref, DerefMut}; @@ -237,6 +238,24 @@ impl Write for NamedTlsStream { } } +pub struct NamedHttpClientStream { + url: Atom, + body_reader: Box, +} + +impl Debug for NamedHttpClientStream { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Http Client Stream [{}]", self.url.as_str()) + } +} + +impl Read for NamedHttpClientStream { + #[inline] + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + self.body_reader.read(buf) + } +} + #[derive(Debug)] pub struct StandardOutputStream {} @@ -375,6 +394,7 @@ arena_allocated_impl_for_stream!(CharReader, InputFileStream); arena_allocated_impl_for_stream!(OutputFileStream, OutputFileStream); arena_allocated_impl_for_stream!(CharReader, NamedTcpStream); arena_allocated_impl_for_stream!(CharReader, NamedTlsStream); +arena_allocated_impl_for_stream!(CharReader, NamedHttpClientStream); arena_allocated_impl_for_stream!(ReadlineStream, ReadlineStream); arena_allocated_impl_for_stream!(StaticStringStream, StaticStringStream); arena_allocated_impl_for_stream!(StandardOutputStream, StandardOutputStream); @@ -388,6 +408,7 @@ pub enum Stream { StaticString(TypedArenaPtr>), NamedTcp(TypedArenaPtr>>), NamedTls(TypedArenaPtr>>), + NamedHttpClient(TypedArenaPtr>>), Null(StreamOptions), Readline(TypedArenaPtr>), StandardOutput(TypedArenaPtr>), @@ -442,6 +463,7 @@ impl Stream { } ArenaHeaderTag::NamedTcpStream => Stream::NamedTcp(TypedArenaPtr::new(ptr as *mut _)), ArenaHeaderTag::NamedTlsStream => Stream::NamedTls(TypedArenaPtr::new(ptr as *mut _)), + ArenaHeaderTag::NamedHttpClientStream => Stream::NamedHttpClient(TypedArenaPtr::new(ptr as *mut _)), ArenaHeaderTag::ReadlineStream => Stream::Readline(TypedArenaPtr::new(ptr as *mut _)), ArenaHeaderTag::StaticStringStream => { Stream::StaticString(TypedArenaPtr::new(ptr as *mut _)) @@ -492,6 +514,7 @@ impl Stream { Stream::StaticString(ptr) => ptr.header_ptr(), Stream::NamedTcp(ptr) => ptr.header_ptr(), Stream::NamedTls(ptr) => ptr.header_ptr(), + Stream::NamedHttpClient(ptr) => ptr.header_ptr(), Stream::Null(_) => ptr::null(), Stream::Readline(ptr) => ptr.header_ptr(), Stream::StandardOutput(ptr) => ptr.header_ptr(), @@ -507,6 +530,7 @@ impl Stream { Stream::StaticString(ref ptr) => &ptr.options, Stream::NamedTcp(ref ptr) => &ptr.options, Stream::NamedTls(ref ptr) => &ptr.options, + Stream::NamedHttpClient(ref ptr) => &ptr.options, Stream::Null(ref options) => options, Stream::Readline(ref ptr) => &ptr.options, Stream::StandardOutput(ref ptr) => &ptr.options, @@ -522,6 +546,7 @@ impl Stream { Stream::StaticString(ref mut ptr) => &mut ptr.options, Stream::NamedTcp(ref mut ptr) => &mut ptr.options, Stream::NamedTls(ref mut ptr) => &mut ptr.options, + Stream::NamedHttpClient(ref mut ptr) => &mut ptr.options, Stream::Null(ref mut options) => options, Stream::Readline(ref mut ptr) => &mut ptr.options, Stream::StandardOutput(ref mut ptr) => &mut ptr.options, @@ -538,6 +563,7 @@ impl Stream { Stream::StaticString(ptr) => ptr.lines_read += incr_num_lines_read, Stream::NamedTcp(ptr) => ptr.lines_read += incr_num_lines_read, Stream::NamedTls(ptr) => ptr.lines_read += incr_num_lines_read, + Stream::NamedHttpClient(ptr) => ptr.lines_read += incr_num_lines_read, Stream::Null(_) => {} Stream::Readline(ptr) => ptr.lines_read += incr_num_lines_read, Stream::StandardOutput(ptr) => ptr.lines_read += incr_num_lines_read, @@ -554,6 +580,7 @@ impl Stream { Stream::StaticString(ptr) => ptr.lines_read = value, Stream::NamedTcp(ptr) => ptr.lines_read = value, Stream::NamedTls(ptr) => ptr.lines_read = value, + Stream::NamedHttpClient(ptr) => ptr.lines_read = value, Stream::Null(_) => {} Stream::Readline(ptr) => ptr.lines_read = value, Stream::StandardOutput(ptr) => ptr.lines_read = value, @@ -570,6 +597,7 @@ impl Stream { Stream::StaticString(ptr) => ptr.lines_read, Stream::NamedTcp(ptr) => ptr.lines_read, Stream::NamedTls(ptr) => ptr.lines_read, + Stream::NamedHttpClient(ptr) => ptr.lines_read, Stream::Null(_) => 0, Stream::Readline(ptr) => ptr.lines_read, Stream::StandardOutput(ptr) => ptr.lines_read, @@ -584,6 +612,7 @@ impl CharRead for Stream { Stream::InputFile(file) => (*file).peek_char(), Stream::NamedTcp(tcp_stream) => (*tcp_stream).peek_char(), Stream::NamedTls(tls_stream) => (*tls_stream).peek_char(), + Stream::NamedHttpClient(http_stream) => (*http_stream).peek_char(), Stream::Readline(rl_stream) => (*rl_stream).peek_char(), Stream::StaticString(src) => (*src).peek_char(), Stream::Byte(cursor) => (*cursor).peek_char(), @@ -602,6 +631,7 @@ impl CharRead for Stream { Stream::InputFile(file) => (*file).read_char(), Stream::NamedTcp(tcp_stream) => (*tcp_stream).read_char(), Stream::NamedTls(tls_stream) => (*tls_stream).read_char(), + Stream::NamedHttpClient(http_stream) => (*http_stream).read_char(), Stream::Readline(rl_stream) => (*rl_stream).read_char(), Stream::StaticString(src) => (*src).read_char(), Stream::Byte(cursor) => (*cursor).read_char(), @@ -620,6 +650,7 @@ impl CharRead for Stream { Stream::InputFile(file) => file.put_back_char(c), Stream::NamedTcp(tcp_stream) => tcp_stream.put_back_char(c), Stream::NamedTls(tls_stream) => tls_stream.put_back_char(c), + Stream::NamedHttpClient(http_stream) => http_stream.put_back_char(c), Stream::Readline(rl_stream) => rl_stream.put_back_char(c), Stream::StaticString(src) => src.put_back_char(c), Stream::Byte(cursor) => cursor.put_back_char(c), @@ -635,6 +666,7 @@ impl CharRead for Stream { Stream::InputFile(ref mut file) => file.consume(nread), Stream::NamedTcp(ref mut tcp_stream) => tcp_stream.consume(nread), Stream::NamedTls(ref mut tls_stream) => tls_stream.consume(nread), + Stream::NamedHttpClient(ref mut http_stream) => http_stream.consume(nread), Stream::Readline(ref mut rl_stream) => rl_stream.consume(nread), Stream::StaticString(ref mut src) => src.consume(nread), Stream::Byte(ref mut cursor) => cursor.consume(nread), @@ -653,6 +685,7 @@ impl Read for Stream { Stream::InputFile(file) => (*file).read(buf), Stream::NamedTcp(tcp_stream) => (*tcp_stream).read(buf), Stream::NamedTls(tls_stream) => (*tls_stream).read(buf), + Stream::NamedHttpClient(http_stream) => (*http_stream).read(buf), Stream::Readline(rl_stream) => (*rl_stream).read(buf), Stream::StaticString(src) => (*src).read(buf), Stream::Byte(cursor) => (*cursor).read(buf), @@ -678,6 +711,7 @@ impl Write for Stream { Stream::Byte(ref mut cursor) => cursor.get_mut().write(buf), Stream::StandardOutput(stream) => stream.write(buf), Stream::StandardError(stream) => stream.write(buf), + Stream::NamedHttpClient(_) | Stream::StaticString(_) | Stream::Readline(_) | Stream::InputFile(..) | @@ -696,6 +730,7 @@ impl Write for Stream { Stream::Byte(ref mut cursor) => cursor.stream.get_mut().flush(), Stream::StandardError(stream) => stream.stream.flush(), Stream::StandardOutput(stream) => stream.stream.flush(), + Stream::NamedHttpClient(_) | Stream::StaticString(_) | Stream::Readline(_) | Stream::InputFile(_) | @@ -820,6 +855,7 @@ impl Stream { Stream::StaticString(stream) => stream.past_end_of_stream, Stream::NamedTcp(stream) => stream.past_end_of_stream, Stream::NamedTls(stream) => stream.past_end_of_stream, + Stream::NamedHttpClient(stream) => stream.past_end_of_stream, Stream::Null(_) => false, Stream::Readline(stream) => stream.past_end_of_stream, Stream::StandardOutput(stream) => stream.past_end_of_stream, @@ -841,6 +877,7 @@ impl Stream { Stream::StaticString(stream) => stream.past_end_of_stream = value, Stream::NamedTcp(stream) => stream.past_end_of_stream = value, Stream::NamedTls(stream) => stream.past_end_of_stream = value, + Stream::NamedHttpClient(stream) => stream.past_end_of_stream = value, Stream::Null(_) => {} Stream::Readline(stream) => stream.past_end_of_stream = value, Stream::StandardOutput(stream) => stream.past_end_of_stream = value, @@ -904,6 +941,7 @@ impl Stream { Stream::Byte(_) | Stream::Readline(_) | Stream::StaticString(_) + | Stream::NamedHttpClient(_) | Stream::InputFile(..) => atom!("read"), Stream::NamedTcp(..) | Stream::NamedTls(..) => atom!("read_append"), Stream::OutputFile(file) if file.is_append => atom!("append"), @@ -961,6 +999,21 @@ impl Stream { )) } + #[inline] + pub(crate) fn from_http_stream( + url: Atom, + http_stream: Box, + arena: &mut Arena, + ) -> Self { + Stream::NamedHttpClient(arena_alloc!( + StreamLayout::new(CharReader::new(NamedHttpClientStream { + url, + body_reader: http_stream + })), + arena + )) + } + #[inline] pub(crate) fn from_file_as_output( file_name: Atom, @@ -1033,6 +1086,7 @@ impl Stream { match self { Stream::NamedTcp(..) | Stream::NamedTls(..) + | Stream::NamedHttpClient(..) | Stream::Byte(_) | Stream::Readline(_) | Stream::StaticString(_) diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 35b9b9d6..efd70c8a 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -73,6 +73,10 @@ use base64; use roxmltree; use select; +use hyper::{Body, Client, Method, Request, Uri}; +use hyper::body::Buf; +use hyper_tls::HttpsConnector; + ref_thread_local! { pub(crate) static managed RANDOM_STATE: RandState<'static> = RandState::new(); } @@ -3263,6 +3267,78 @@ impl Machine { Ok(()) } + #[inline(always)] + pub(crate) fn http_open(&mut self) -> CallResult { + let address_sink = self.machine_st.store(self.machine_st.deref(self.machine_st.registers[1])); + let method = read_heap_cell!(self.machine_st.store(self.machine_st.deref(self.machine_st.registers[3])), + (HeapCellValueTag::Atom, (name, arity)) => { + debug_assert_eq!(arity, 0); + match name { + atom!("get") => Method::GET, + atom!("post") => Method::POST, + atom!("put") => Method::PUT, + atom!("delete") => Method::DELETE, + atom!("patch") => Method::PATCH, + atom!("head") => Method::HEAD, + _ => unreachable!(), + } + } + _ => { + unreachable!() + } + ); + if let Some(address_sink) = self.machine_st.value_to_str_like(address_sink) { + let address_string = match address_sink { + AtomOrString::Atom(atom) => { + String::from(atom.as_str()) + } + AtomOrString::String(string) => { + String::from(string.as_str()) + } + }; + let address: Uri = address_string.parse().unwrap(); + + let stream = self.runtime.block_on(async { + let https = HttpsConnector::new(); + let client = Client::builder() + .build::<_, hyper::Body>(https); + let req = Request::builder() + .method(method) + .uri(address) + .body(Body::empty()) + .unwrap(); + let mut resp = client.request(req).await.unwrap(); + let buf = hyper::body::aggregate(resp).await.unwrap(); + let mut reader = buf.reader(); + + let mut stream = Stream::from_http_stream( + self.machine_st.atom_tbl.build_with(&address_string), + Box::new(reader), + &mut self.machine_st.arena + ); + *stream.options_mut() = StreamOptions::default(); + if let Some(alias) = stream.options().get_alias() { + self.indices.stream_aliases.insert(alias, stream); + } + + self.indices.streams.insert(stream); + + stream_as_cell!(stream) + }); + + let stream_addr = self.machine_st.store(self.machine_st.deref(self.machine_st.registers[2])); + self.machine_st.bind(stream_addr.as_var().unwrap(), stream); + + } else { + let err = self.machine_st.domain_error(DomainErrorType::SourceSink, address_sink); + let stub = functor_stub(atom!("http_open"), 3); + + return Err(self.machine_st.error_form(err, stub)); + } + + Ok(()) + } + #[inline(always)] pub(crate) fn current_time(&mut self) { let timestamp = self.systemtime_to_timestamp(SystemTime::now()); diff --git a/src/macros.rs b/src/macros.rs index a51a30b2..22968005 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -305,6 +305,7 @@ macro_rules! match_untyped_arena_ptr_pat { | ArenaHeaderTag::OutputFileStream | ArenaHeaderTag::NamedTcpStream | ArenaHeaderTag::NamedTlsStream + | ArenaHeaderTag::NamedHttpClientStream | ArenaHeaderTag::ReadlineStream | ArenaHeaderTag::StaticStringStream | ArenaHeaderTag::ByteStream