mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-07 21:07:46 +00:00
Revert "[python] support Sanic >=21 and python >= 3.10" (#8241)
- Reverts vercel/vercel#8045 - Fixes vercel/vercel#8231
This commit is contained in:
@@ -1,12 +0,0 @@
|
|||||||
[[source]]
|
|
||||||
name = "pypi"
|
|
||||||
url = "https://pypi.org/simple"
|
|
||||||
verify_ssl = true
|
|
||||||
|
|
||||||
[dev-packages]
|
|
||||||
|
|
||||||
[packages]
|
|
||||||
sanic = "22.3.2"
|
|
||||||
|
|
||||||
[requires]
|
|
||||||
python_version = "3.10"
|
|
||||||
203
packages/python/test/fixtures/30-asgi-lifespan/Pipfile.lock
generated
vendored
203
packages/python/test/fixtures/30-asgi-lifespan/Pipfile.lock
generated
vendored
@@ -1,203 +0,0 @@
|
|||||||
{
|
|
||||||
"_meta": {
|
|
||||||
"hash": {
|
|
||||||
"sha256": "390914ba991c8a230704140fc6be20ca33aa3b6d6359ca151be04d07c9bc6536"
|
|
||||||
},
|
|
||||||
"pipfile-spec": 6,
|
|
||||||
"requires": {
|
|
||||||
"python_version": "3.10"
|
|
||||||
},
|
|
||||||
"sources": [
|
|
||||||
{
|
|
||||||
"name": "pypi",
|
|
||||||
"url": "https://pypi.org/simple",
|
|
||||||
"verify_ssl": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"default": {
|
|
||||||
"aiofiles": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937",
|
|
||||||
"sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"
|
|
||||||
],
|
|
||||||
"markers": "python_version >= '3.6' and python_version < '4.0'",
|
|
||||||
"version": "==0.8.0"
|
|
||||||
},
|
|
||||||
"httptools": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:1a99346ebcb801b213c591540837340bdf6fd060a8687518d01c607d338b7424",
|
|
||||||
"sha256:1ee0b459257e222b878a6c09ccf233957d3a4dcb883b0847640af98d2d9aac23",
|
|
||||||
"sha256:20a45bcf22452a10fa8d58b7dbdb474381f6946bf5b8933e3662d572bc61bae4",
|
|
||||||
"sha256:29bf97a5c532da9c7a04de2c7a9c31d1d54f3abd65a464119b680206bbbb1055",
|
|
||||||
"sha256:2c9a930c378b3d15d6b695fb95ebcff81a7395b4f9775c4f10a076beb0b2c1ff",
|
|
||||||
"sha256:2db44a0b294d317199e9f80123e72c6b005c55b625b57fae36de68670090fa48",
|
|
||||||
"sha256:3194f6d6443befa8d4db16c1946b2fc428a3ceb8ab32eb6f09a59f86104dc1a0",
|
|
||||||
"sha256:34d2903dd2a3dd85d33705b6fde40bf91fc44411661283763fd0746723963c83",
|
|
||||||
"sha256:48e48530d9b995a84d1d89ae6b3ec4e59ea7d494b150ac3bbc5e2ac4acce92cd",
|
|
||||||
"sha256:54bbd295f031b866b9799dd39cb45deee81aca036c9bff9f58ca06726f6494f1",
|
|
||||||
"sha256:5d1fe6b6661022fd6cac541f54a4237496b246e6f1c0a6b41998ee08a1135afe",
|
|
||||||
"sha256:645373c070080e632480a3d251d892cb795be3d3a15f86975d0f1aca56fd230d",
|
|
||||||
"sha256:6a1a7dfc1f9c78a833e2c4904757a0f47ce25d08634dd2a52af394eefe5f9777",
|
|
||||||
"sha256:701e66b59dd21a32a274771238025d58db7e2b6ecebbab64ceff51b8e31527ae",
|
|
||||||
"sha256:72aa3fbe636b16d22e04b5a9d24711b043495e0ecfe58080addf23a1a37f3409",
|
|
||||||
"sha256:7af6bdbd21a2a25d6784f6d67f44f5df33ef39b6159543b9f9064d365c01f919",
|
|
||||||
"sha256:7ee9f226acab9085037582c059d66769862706e8e8cd2340470ceb8b3850873d",
|
|
||||||
"sha256:7f7bfb74718f52d5ed47d608d507bf66d3bc01d4a8b3e6dd7134daaae129357b",
|
|
||||||
"sha256:8e2eb957787cbb614a0f006bfc5798ff1d90ac7c4dd24854c84edbdc8c02369e",
|
|
||||||
"sha256:903f739c9fb78dab8970b0f3ea51f21955b24b45afa77b22ff0e172fc11ef111",
|
|
||||||
"sha256:98993805f1e3cdb53de4eed02b55dcc953cdf017ba7bbb2fd89226c086a6d855",
|
|
||||||
"sha256:9967d9758df505975913304c434cb9ab21e2c609ad859eb921f2f615a038c8de",
|
|
||||||
"sha256:a113789e53ac1fa26edf99856a61e4c493868e125ae0dd6354cf518948fbbd5c",
|
|
||||||
"sha256:a522d12e2ddbc2e91842ffb454a1aeb0d47607972c7d8fc88bd0838d97fb8a2a",
|
|
||||||
"sha256:abe829275cdd4174b4c4e65ad718715d449e308d59793bf3a931ee1bf7e7b86c",
|
|
||||||
"sha256:c286985b5e194ca0ebb2908d71464b9be8f17cc66d6d3e330e8d5407248f56ad",
|
|
||||||
"sha256:cd1295f52971097f757edfbfce827b6dbbfb0f7a74901ee7d4933dff5ad4c9af",
|
|
||||||
"sha256:ceafd5e960b39c7e0d160a1936b68eb87c5e79b3979d66e774f0c77d4d8faaed",
|
|
||||||
"sha256:d1f27bb0f75bef722d6e22dc609612bfa2f994541621cd2163f8c943b6463dfe",
|
|
||||||
"sha256:d3a4e165ca6204f34856b765d515d558dc84f1352033b8721e8d06c3e44930c3",
|
|
||||||
"sha256:d9b90bf58f3ba04e60321a23a8723a1ff2a9377502535e70495e5ada8e6e6722",
|
|
||||||
"sha256:f72b5d24d6730035128b238decdc4c0f2104b7056a7ca55cf047c106842ec890",
|
|
||||||
"sha256:fcddfe70553be717d9745990dfdb194e22ee0f60eb8f48c0794e7bfeda30d2d5",
|
|
||||||
"sha256:fdb9f9ed79bc6f46b021b3319184699ba1a22410a82204e6e89c774530069683"
|
|
||||||
],
|
|
||||||
"markers": "python_full_version >= '3.5.0'",
|
|
||||||
"version": "==0.4.0"
|
|
||||||
},
|
|
||||||
"multidict": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60",
|
|
||||||
"sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c",
|
|
||||||
"sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672",
|
|
||||||
"sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51",
|
|
||||||
"sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032",
|
|
||||||
"sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2",
|
|
||||||
"sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b",
|
|
||||||
"sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80",
|
|
||||||
"sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88",
|
|
||||||
"sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a",
|
|
||||||
"sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d",
|
|
||||||
"sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389",
|
|
||||||
"sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c",
|
|
||||||
"sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9",
|
|
||||||
"sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c",
|
|
||||||
"sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516",
|
|
||||||
"sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b",
|
|
||||||
"sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43",
|
|
||||||
"sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee",
|
|
||||||
"sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227",
|
|
||||||
"sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d",
|
|
||||||
"sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae",
|
|
||||||
"sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7",
|
|
||||||
"sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4",
|
|
||||||
"sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9",
|
|
||||||
"sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f",
|
|
||||||
"sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013",
|
|
||||||
"sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9",
|
|
||||||
"sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e",
|
|
||||||
"sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693",
|
|
||||||
"sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a",
|
|
||||||
"sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15",
|
|
||||||
"sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb",
|
|
||||||
"sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96",
|
|
||||||
"sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87",
|
|
||||||
"sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376",
|
|
||||||
"sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658",
|
|
||||||
"sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0",
|
|
||||||
"sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071",
|
|
||||||
"sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360",
|
|
||||||
"sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc",
|
|
||||||
"sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3",
|
|
||||||
"sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba",
|
|
||||||
"sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8",
|
|
||||||
"sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9",
|
|
||||||
"sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2",
|
|
||||||
"sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3",
|
|
||||||
"sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68",
|
|
||||||
"sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8",
|
|
||||||
"sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d",
|
|
||||||
"sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49",
|
|
||||||
"sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608",
|
|
||||||
"sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57",
|
|
||||||
"sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86",
|
|
||||||
"sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20",
|
|
||||||
"sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293",
|
|
||||||
"sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849",
|
|
||||||
"sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937",
|
|
||||||
"sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"
|
|
||||||
],
|
|
||||||
"markers": "python_version >= '3.7'",
|
|
||||||
"version": "==6.0.2"
|
|
||||||
},
|
|
||||||
"sanic": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:d0653de59cf3073d8ca047253db72c868510d45d753c13b6316aede769fb66fb",
|
|
||||||
"sha256:f6eb181e7a1b9a77a3b916de0f1413eddbe384c59487c2a4bff0c7a41e66e080"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==22.6.0"
|
|
||||||
},
|
|
||||||
"sanic-routing": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:8282fc05659ff2cebbffa4fb69697601fc9d653c34e0b5bdeed04a832e793fb9",
|
|
||||||
"sha256:fde5a7d4079794b585b9a2904accd0de5a70abf27c82d2658b40c551ef44f703"
|
|
||||||
],
|
|
||||||
"version": "==22.3.0"
|
|
||||||
},
|
|
||||||
"websockets": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:07cdc0a5b2549bcfbadb585ad8471ebdc7bdf91e32e34ae3889001c1c106a6af",
|
|
||||||
"sha256:210aad7fdd381c52e58777560860c7e6110b6174488ef1d4b681c08b68bf7f8c",
|
|
||||||
"sha256:28dd20b938a57c3124028680dc1600c197294da5db4292c76a0b48efb3ed7f76",
|
|
||||||
"sha256:2f94fa3ae454a63ea3a19f73b95deeebc9f02ba2d5617ca16f0bbdae375cda47",
|
|
||||||
"sha256:31564a67c3e4005f27815634343df688b25705cccb22bc1db621c781ddc64c69",
|
|
||||||
"sha256:347974105bbd4ea068106ec65e8e8ebd86f28c19e529d115d89bd8cc5cda3079",
|
|
||||||
"sha256:379e03422178436af4f3abe0aa8f401aa77ae2487843738542a75faf44a31f0c",
|
|
||||||
"sha256:3eda1cb7e9da1b22588cefff09f0951771d6ee9fa8dbe66f5ae04cc5f26b2b55",
|
|
||||||
"sha256:51695d3b199cd03098ae5b42833006a0f43dc5418d3102972addc593a783bc02",
|
|
||||||
"sha256:54c000abeaff6d8771a4e2cef40900919908ea7b6b6a30eae72752607c6db559",
|
|
||||||
"sha256:5b936bf552e4f6357f5727579072ff1e1324717902127ffe60c92d29b67b7be3",
|
|
||||||
"sha256:6075fd24df23133c1b078e08a9b04a3bc40b31a8def4ee0b9f2c8865acce913e",
|
|
||||||
"sha256:661f641b44ed315556a2fa630239adfd77bd1b11cb0b9d96ed8ad90b0b1e4978",
|
|
||||||
"sha256:6ea6b300a6bdd782e49922d690e11c3669828fe36fc2471408c58b93b5535a98",
|
|
||||||
"sha256:6ed1d6f791eabfd9808afea1e068f5e59418e55721db8b7f3bfc39dc831c42ae",
|
|
||||||
"sha256:7934e055fd5cd9dee60f11d16c8d79c4567315824bacb1246d0208a47eca9755",
|
|
||||||
"sha256:7ab36e17af592eec5747c68ef2722a74c1a4a70f3772bc661079baf4ae30e40d",
|
|
||||||
"sha256:7f6d96fdb0975044fdd7953b35d003b03f9e2bcf85f2d2cf86285ece53e9f991",
|
|
||||||
"sha256:83e5ca0d5b743cde3d29fda74ccab37bdd0911f25bd4cdf09ff8b51b7b4f2fa1",
|
|
||||||
"sha256:85506b3328a9e083cc0a0fb3ba27e33c8db78341b3eb12eb72e8afd166c36680",
|
|
||||||
"sha256:8af75085b4bc0b5c40c4a3c0e113fa95e84c60f4ed6786cbb675aeb1ee128247",
|
|
||||||
"sha256:8b1359aba0ff810d5830d5ab8e2c4a02bebf98a60aa0124fb29aa78cfdb8031f",
|
|
||||||
"sha256:8fbd7d77f8aba46d43245e86dd91a8970eac4fb74c473f8e30e9c07581f852b2",
|
|
||||||
"sha256:907e8247480f287aa9bbc9391bd6de23c906d48af54c8c421df84655eef66af7",
|
|
||||||
"sha256:93d5ea0b5da8d66d868b32c614d2b52d14304444e39e13a59566d4acb8d6e2e4",
|
|
||||||
"sha256:97bc9d41e69a7521a358f9b8e44871f6cdeb42af31815c17aed36372d4eec667",
|
|
||||||
"sha256:994cdb1942a7a4c2e10098d9162948c9e7b235df755de91ca33f6e0481366fdb",
|
|
||||||
"sha256:a141de3d5a92188234afa61653ed0bbd2dde46ad47b15c3042ffb89548e77094",
|
|
||||||
"sha256:a1e15b230c3613e8ea82c9fc6941b2093e8eb939dd794c02754d33980ba81e36",
|
|
||||||
"sha256:aad5e300ab32036eb3fdc350ad30877210e2f51bceaca83fb7fef4d2b6c72b79",
|
|
||||||
"sha256:b529fdfa881b69fe563dbd98acce84f3e5a67df13de415e143ef053ff006d500",
|
|
||||||
"sha256:b9c77f0d1436ea4b4dc089ed8335fa141e6a251a92f75f675056dac4ab47a71e",
|
|
||||||
"sha256:bb621ec2dbbbe8df78a27dbd9dd7919f9b7d32a73fafcb4d9252fc4637343582",
|
|
||||||
"sha256:c7250848ce69559756ad0086a37b82c986cd33c2d344ab87fea596c5ac6d9442",
|
|
||||||
"sha256:c8d1d14aa0f600b5be363077b621b1b4d1eb3fbf90af83f9281cda668e6ff7fd",
|
|
||||||
"sha256:d1655a6fc7aecd333b079d00fb3c8132d18988e47f19740c69303bf02e9883c6",
|
|
||||||
"sha256:d6353ba89cfc657a3f5beabb3b69be226adbb5c6c7a66398e17809b0ce3c4731",
|
|
||||||
"sha256:da4377904a3379f0c1b75a965fff23b28315bcd516d27f99a803720dfebd94d4",
|
|
||||||
"sha256:e49ea4c1a9543d2bd8a747ff24411509c29e4bdcde05b5b0895e2120cb1a761d",
|
|
||||||
"sha256:e4e08305bfd76ba8edab08dcc6496f40674f44eb9d5e23153efa0a35750337e8",
|
|
||||||
"sha256:e6fa05a680e35d0fcc1470cb070b10e6fe247af54768f488ed93542e71339d6f",
|
|
||||||
"sha256:e7e6f2d6fd48422071cc8a6f8542016f350b79cc782752de531577d35e9bd677",
|
|
||||||
"sha256:e904c0381c014b914136c492c8fa711ca4cced4e9b3d110e5e7d436d0fc289e8",
|
|
||||||
"sha256:ec2b0ab7edc8cd4b0eb428b38ed89079bdc20c6bdb5f889d353011038caac2f9",
|
|
||||||
"sha256:ef5ce841e102278c1c2e98f043db99d6755b1c58bde475516aef3a008ed7f28e",
|
|
||||||
"sha256:f351c7d7d92f67c0609329ab2735eee0426a03022771b00102816a72715bb00b",
|
|
||||||
"sha256:fab7c640815812ed5f10fbee7abbf58788d602046b7bb3af9b1ac753a6d5e916",
|
|
||||||
"sha256:fc06cc8073c8e87072138ba1e431300e2d408f054b27047d047b549455066ff4"
|
|
||||||
],
|
|
||||||
"markers": "python_version >= '3.7'",
|
|
||||||
"version": "==10.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"develop": {}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
async def app(scope, receive, send):
|
|
||||||
if scope['type'] == 'http':
|
|
||||||
await send(
|
|
||||||
{
|
|
||||||
"type": "http.response.start",
|
|
||||||
"status": 200,
|
|
||||||
"headers": [[b"content-type", b"text/html"]],
|
|
||||||
}
|
|
||||||
)
|
|
||||||
await send(
|
|
||||||
{
|
|
||||||
"type": "http.response.body",
|
|
||||||
"body": b"asgi:RANDOMNESS_PLACEHOLDER"
|
|
||||||
}
|
|
||||||
)
|
|
||||||
elif scope['type'] == 'lifespan':
|
|
||||||
while True:
|
|
||||||
message = await receive()
|
|
||||||
if message['type'] == 'lifespan.startup':
|
|
||||||
await send({'type': 'lifespan.startup.complete'})
|
|
||||||
elif message['type'] == 'lifespan.shutdown':
|
|
||||||
await send({'type': 'lifespan.shutdown.complete'})
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
assert False, "unreachable"
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
from sanic import Sanic
|
|
||||||
from sanic import response
|
|
||||||
app = Sanic("vercel_test")
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/sani22.py")
|
|
||||||
async def index(request):
|
|
||||||
return response.text("asgi:RANDOMNESS_PLACEHOLDER")
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 2,
|
|
||||||
"builds": [
|
|
||||||
{
|
|
||||||
"src": "api/*.py",
|
|
||||||
"use": "@vercel/python"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"probes": [
|
|
||||||
{ "path": "/api/raw.py", "mustContain": "asgi:RANDOMNESS_PLACEHOLDER" },
|
|
||||||
{ "path": "/api/sani22.py", "mustContain": "asgi:RANDOMNESS_PLACEHOLDER" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -167,23 +167,13 @@ elif 'app' in __vc_variables:
|
|||||||
else:
|
else:
|
||||||
print('using Asynchronous Server Gateway Interface (ASGI)')
|
print('using Asynchronous Server Gateway Interface (ASGI)')
|
||||||
# Originally authored by Jordan Eremieff and included under MIT license:
|
# Originally authored by Jordan Eremieff and included under MIT license:
|
||||||
# https://github.com/erm/mangum/blob/07ce20a0e2f67c5c2593258a92c03fdc66d9edda/mangum/__init__.py
|
# https://github.com/erm/mangum/blob/b4d21c8f5e304a3e17b88bc9fa345106acc50ad7/mangum/__init__.py
|
||||||
# https://github.com/erm/mangum/blob/07ce20a0e2f67c5c2593258a92c03fdc66d9edda/LICENSE
|
# https://github.com/erm/mangum/blob/b4d21c8f5e304a3e17b88bc9fa345106acc50ad7/LICENSE
|
||||||
import asyncio
|
import asyncio
|
||||||
import enum
|
import enum
|
||||||
import logging
|
|
||||||
from contextlib import ExitStack
|
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from werkzeug.datastructures import Headers
|
from werkzeug.datastructures import Headers
|
||||||
|
|
||||||
def get_event_loop():
|
|
||||||
try:
|
|
||||||
return asyncio.get_running_loop()
|
|
||||||
except:
|
|
||||||
if sys.version_info < (3, 10):
|
|
||||||
return asyncio.get_event_loop()
|
|
||||||
else:
|
|
||||||
return asyncio.get_event_loop_policy().get_event_loop()
|
|
||||||
|
|
||||||
class ASGICycleState(enum.Enum):
|
class ASGICycleState(enum.Enum):
|
||||||
REQUEST = enum.auto()
|
REQUEST = enum.auto()
|
||||||
@@ -204,8 +194,8 @@ elif 'app' in __vc_variables:
|
|||||||
ASGI instance using the connection scope.
|
ASGI instance using the connection scope.
|
||||||
Runs until the response is completely read from the application.
|
Runs until the response is completely read from the application.
|
||||||
"""
|
"""
|
||||||
loop = get_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
self.app_queue = asyncio.Queue()
|
self.app_queue = asyncio.Queue(loop=loop)
|
||||||
self.put_message({'type': 'http.request', 'body': body, 'more_body': False})
|
self.put_message({'type': 'http.request', 'body': body, 'more_body': False})
|
||||||
|
|
||||||
asgi_instance = app(self.scope, self.receive, self.send)
|
asgi_instance = app(self.scope, self.receive, self.send)
|
||||||
@@ -267,156 +257,6 @@ elif 'app' in __vc_variables:
|
|||||||
self.response['body'] = base64.b64encode(self.body).decode('utf-8')
|
self.response['body'] = base64.b64encode(self.body).decode('utf-8')
|
||||||
self.response['encoding'] = 'base64'
|
self.response['encoding'] = 'base64'
|
||||||
|
|
||||||
class LifespanFailure(Exception):
|
|
||||||
"""Raise when a lifespan failure event is sent by an application."""
|
|
||||||
|
|
||||||
class LifespanUnsupported(Exception):
|
|
||||||
"""Raise when lifespan events are not supported by an application."""
|
|
||||||
|
|
||||||
class UnexpectedMessage(Exception):
|
|
||||||
"""Raise when an unexpected message type is received during an ASGI cycle."""
|
|
||||||
|
|
||||||
class LifespanCycleState(enum.Enum):
|
|
||||||
"""
|
|
||||||
The state of the ASGI `lifespan` connection.
|
|
||||||
* **CONNECTING** - Initial state. The ASGI application instance will be run with
|
|
||||||
the connection scope containing the `lifespan` type.
|
|
||||||
* **STARTUP** - The lifespan startup event has been pushed to the queue to be
|
|
||||||
received by the application.
|
|
||||||
* **SHUTDOWN** - The lifespan shutdown event has been pushed to the queue to be
|
|
||||||
received by the application.
|
|
||||||
* **FAILED** - A lifespan failure has been detected, and the connection will be
|
|
||||||
closed with an error.
|
|
||||||
* **UNSUPPORTED** - An application attempted to send a message before receiving
|
|
||||||
the lifepan startup event. If the lifespan argument is "on", then the connection
|
|
||||||
will be closed with an error.
|
|
||||||
"""
|
|
||||||
|
|
||||||
CONNECTING = enum.auto()
|
|
||||||
STARTUP = enum.auto()
|
|
||||||
SHUTDOWN = enum.auto()
|
|
||||||
FAILED = enum.auto()
|
|
||||||
UNSUPPORTED = enum.auto()
|
|
||||||
|
|
||||||
class Lifespan:
|
|
||||||
|
|
||||||
def __init__(self, app):
|
|
||||||
self.app = app
|
|
||||||
self.state = LifespanCycleState.CONNECTING
|
|
||||||
self.exception = None
|
|
||||||
self.logger = logging.getLogger('lifespan')
|
|
||||||
self.loop = get_event_loop()
|
|
||||||
self.app_queue = asyncio.Queue()
|
|
||||||
self.startup_event = asyncio.Event()
|
|
||||||
self.shutdown_event = asyncio.Event()
|
|
||||||
|
|
||||||
|
|
||||||
def __enter__(self) -> None:
|
|
||||||
"""Runs the event loop for application startup."""
|
|
||||||
self.loop.create_task(self.run())
|
|
||||||
self.loop.run_until_complete(self.startup())
|
|
||||||
|
|
||||||
def __exit__(
|
|
||||||
self,
|
|
||||||
exc_type,
|
|
||||||
exc_value,
|
|
||||||
traceback,
|
|
||||||
) -> None:
|
|
||||||
"""Runs the event loop for application shutdown."""
|
|
||||||
self.loop.run_until_complete(self.shutdown())
|
|
||||||
|
|
||||||
async def run(self):
|
|
||||||
"""Calls the application with the `lifespan` connection scope."""
|
|
||||||
try:
|
|
||||||
await self.app(
|
|
||||||
{"type": "lifespan", "asgi": {"spec_version": "2.0", "version": "3.0"}},
|
|
||||||
self.receive,
|
|
||||||
self.send,
|
|
||||||
)
|
|
||||||
except LifespanUnsupported:
|
|
||||||
self.logger.info("ASGI 'lifespan' protocol appears unsupported.")
|
|
||||||
except (LifespanFailure, UnexpectedMessage) as exc:
|
|
||||||
self.exception = exc
|
|
||||||
except BaseException as exc:
|
|
||||||
self.logger.error("Exception in 'lifespan' protocol.", exc_info=exc)
|
|
||||||
finally:
|
|
||||||
self.startup_event.set()
|
|
||||||
self.shutdown_event.set()
|
|
||||||
|
|
||||||
async def send(self, message):
|
|
||||||
"""Awaited by the application to send ASGI `lifespan` events."""
|
|
||||||
message_type = message["type"]
|
|
||||||
|
|
||||||
if self.state is LifespanCycleState.CONNECTING:
|
|
||||||
# If a message is sent before the startup event is received by the
|
|
||||||
# application, then assume that lifespan is unsupported.
|
|
||||||
self.state = LifespanCycleState.UNSUPPORTED
|
|
||||||
raise LifespanUnsupported("Lifespan protocol appears unsupported.")
|
|
||||||
|
|
||||||
if message_type not in (
|
|
||||||
"lifespan.startup.complete",
|
|
||||||
"lifespan.shutdown.complete",
|
|
||||||
"lifespan.startup.failed",
|
|
||||||
"lifespan.shutdown.failed",
|
|
||||||
):
|
|
||||||
self.state = LifespanCycleState.FAILED
|
|
||||||
raise UnexpectedMessage(f"Unexpected '{message_type}' event received.")
|
|
||||||
|
|
||||||
if self.state is LifespanCycleState.STARTUP:
|
|
||||||
if message_type == "lifespan.startup.complete":
|
|
||||||
self.startup_event.set()
|
|
||||||
elif message_type == "lifespan.startup.failed":
|
|
||||||
self.state = LifespanCycleState.FAILED
|
|
||||||
self.startup_event.set()
|
|
||||||
message_value = message.get("message", "")
|
|
||||||
raise LifespanFailure(f"Lifespan startup failure. {message_value}")
|
|
||||||
|
|
||||||
elif self.state is LifespanCycleState.SHUTDOWN:
|
|
||||||
if message_type == "lifespan.shutdown.complete":
|
|
||||||
self.shutdown_event.set()
|
|
||||||
elif message_type == "lifespan.shutdown.failed":
|
|
||||||
self.state = LifespanCycleState.FAILED
|
|
||||||
self.shutdown_event.set()
|
|
||||||
message_value = message.get("message", "")
|
|
||||||
raise LifespanFailure(f"Lifespan shutdown failure. {message_value}")
|
|
||||||
|
|
||||||
async def receive(self):
|
|
||||||
"""Awaited by the application to receive ASGI `lifespan` events."""
|
|
||||||
if self.state is LifespanCycleState.CONNECTING:
|
|
||||||
|
|
||||||
# Connection established. The next event returned by the queue will be
|
|
||||||
# `lifespan.startup` to inform the application that the connection is
|
|
||||||
# ready to receive lfiespan messages.
|
|
||||||
self.state = LifespanCycleState.STARTUP
|
|
||||||
|
|
||||||
elif self.state is LifespanCycleState.STARTUP:
|
|
||||||
|
|
||||||
# Connection shutting down. The next event returned by the queue will be
|
|
||||||
# `lifespan.shutdown` to inform the application that the connection is now
|
|
||||||
# closing so that it may perform cleanup.
|
|
||||||
self.state = LifespanCycleState.SHUTDOWN
|
|
||||||
|
|
||||||
return await self.app_queue.get()
|
|
||||||
|
|
||||||
async def startup(self) -> None:
|
|
||||||
"""Pushes the `lifespan` startup event to the queue and handles errors."""
|
|
||||||
await self.app_queue.put({"type": "lifespan.startup"})
|
|
||||||
await self.startup_event.wait()
|
|
||||||
if self.state is LifespanCycleState.FAILED:
|
|
||||||
raise LifespanFailure(self.exception)
|
|
||||||
|
|
||||||
if not self.exception:
|
|
||||||
self.logger.info("Application startup complete.")
|
|
||||||
else:
|
|
||||||
self.logger.info("Application startup failed.")
|
|
||||||
|
|
||||||
async def shutdown(self) -> None:
|
|
||||||
"""Pushes the `lifespan` shutdown event to the queue and handles errors."""
|
|
||||||
await self.app_queue.put({"type": "lifespan.shutdown"})
|
|
||||||
await self.shutdown_event.wait()
|
|
||||||
if self.state is LifespanCycleState.FAILED:
|
|
||||||
raise LifespanFailure(self.exception)
|
|
||||||
|
|
||||||
def vc_handler(event, context):
|
def vc_handler(event, context):
|
||||||
payload = json.loads(event['body'])
|
payload = json.loads(event['body'])
|
||||||
|
|
||||||
@@ -449,13 +289,9 @@ elif 'app' in __vc_variables:
|
|||||||
'raw_path': path.encode(),
|
'raw_path': path.encode(),
|
||||||
}
|
}
|
||||||
|
|
||||||
with ExitStack() as stack:
|
asgi_cycle = ASGICycle(scope)
|
||||||
lifespan = Lifespan(__vc_module.app)
|
response = asgi_cycle(__vc_module.app, body)
|
||||||
stack.enter_context(lifespan)
|
return response
|
||||||
|
|
||||||
asgi_cycle = ASGICycle(scope)
|
|
||||||
response = asgi_cycle(__vc_module.app, body)
|
|
||||||
return response
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print('Missing variable `handler` or `app` in file "__VC_HANDLER_ENTRYPOINT".')
|
print('Missing variable `handler` or `app` in file "__VC_HANDLER_ENTRYPOINT".')
|
||||||
|
|||||||
Reference in New Issue
Block a user