first commit
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | /target | ||||||
							
								
								
									
										432
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										432
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,432 @@ | |||||||
|  | # This file is automatically @generated by Cargo. | ||||||
|  | # It is not intended for manual editing. | ||||||
|  | version = 3 | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ahash" | ||||||
|  | version = "0.7.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" | ||||||
|  | dependencies = [ | ||||||
|  |  "getrandom", | ||||||
|  |  "once_cell", | ||||||
|  |  "version_check", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "async-trait" | ||||||
|  | version = "0.1.61" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" | ||||||
|  | dependencies = [ | ||||||
|  |  "proc-macro2", | ||||||
|  |  "quote", | ||||||
|  |  "syn", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "base64" | ||||||
|  | version = "0.13.1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "bitflags" | ||||||
|  | version = "1.3.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "block-buffer" | ||||||
|  | version = "0.10.3" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" | ||||||
|  | dependencies = [ | ||||||
|  |  "generic-array", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "cfg-if" | ||||||
|  | version = "1.0.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "config" | ||||||
|  | version = "0.13.3" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" | ||||||
|  | dependencies = [ | ||||||
|  |  "async-trait", | ||||||
|  |  "json5", | ||||||
|  |  "lazy_static", | ||||||
|  |  "nom", | ||||||
|  |  "pathdiff", | ||||||
|  |  "ron", | ||||||
|  |  "rust-ini", | ||||||
|  |  "serde", | ||||||
|  |  "serde_json", | ||||||
|  |  "toml", | ||||||
|  |  "yaml-rust", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "cpufeatures" | ||||||
|  | version = "0.2.5" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" | ||||||
|  | dependencies = [ | ||||||
|  |  "libc", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "crypto-common" | ||||||
|  | version = "0.1.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" | ||||||
|  | dependencies = [ | ||||||
|  |  "generic-array", | ||||||
|  |  "typenum", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "digest" | ||||||
|  | version = "0.10.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" | ||||||
|  | dependencies = [ | ||||||
|  |  "block-buffer", | ||||||
|  |  "crypto-common", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "dlv-list" | ||||||
|  | version = "0.3.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "generic-array" | ||||||
|  | version = "0.14.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" | ||||||
|  | dependencies = [ | ||||||
|  |  "typenum", | ||||||
|  |  "version_check", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "getrandom" | ||||||
|  | version = "0.2.8" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" | ||||||
|  | dependencies = [ | ||||||
|  |  "cfg-if", | ||||||
|  |  "libc", | ||||||
|  |  "wasi", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "hashbrown" | ||||||
|  | version = "0.12.3" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" | ||||||
|  | dependencies = [ | ||||||
|  |  "ahash", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "hello" | ||||||
|  | version = "0.1.0" | ||||||
|  | dependencies = [ | ||||||
|  |  "config", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "itoa" | ||||||
|  | version = "1.0.5" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "json5" | ||||||
|  | version = "0.4.1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" | ||||||
|  | dependencies = [ | ||||||
|  |  "pest", | ||||||
|  |  "pest_derive", | ||||||
|  |  "serde", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "lazy_static" | ||||||
|  | version = "1.4.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "libc" | ||||||
|  | version = "0.2.139" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "linked-hash-map" | ||||||
|  | version = "0.5.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "memchr" | ||||||
|  | version = "2.5.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "minimal-lexical" | ||||||
|  | version = "0.2.1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "nom" | ||||||
|  | version = "7.1.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "e5507769c4919c998e69e49c839d9dc6e693ede4cc4290d6ad8b41d4f09c548c" | ||||||
|  | dependencies = [ | ||||||
|  |  "memchr", | ||||||
|  |  "minimal-lexical", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "once_cell" | ||||||
|  | version = "1.17.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ordered-multimap" | ||||||
|  | version = "0.4.3" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" | ||||||
|  | dependencies = [ | ||||||
|  |  "dlv-list", | ||||||
|  |  "hashbrown", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pathdiff" | ||||||
|  | version = "0.2.1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pest" | ||||||
|  | version = "2.5.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "0f6e86fb9e7026527a0d46bc308b841d73170ef8f443e1807f6ef88526a816d4" | ||||||
|  | dependencies = [ | ||||||
|  |  "thiserror", | ||||||
|  |  "ucd-trie", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pest_derive" | ||||||
|  | version = "2.5.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "96504449aa860c8dcde14f9fba5c58dc6658688ca1fe363589d6327b8662c603" | ||||||
|  | dependencies = [ | ||||||
|  |  "pest", | ||||||
|  |  "pest_generator", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pest_generator" | ||||||
|  | version = "2.5.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "798e0220d1111ae63d66cb66a5dcb3fc2d986d520b98e49e1852bfdb11d7c5e7" | ||||||
|  | dependencies = [ | ||||||
|  |  "pest", | ||||||
|  |  "pest_meta", | ||||||
|  |  "proc-macro2", | ||||||
|  |  "quote", | ||||||
|  |  "syn", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pest_meta" | ||||||
|  | version = "2.5.2" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "984298b75898e30a843e278a9f2452c31e349a073a0ce6fd950a12a74464e065" | ||||||
|  | dependencies = [ | ||||||
|  |  "once_cell", | ||||||
|  |  "pest", | ||||||
|  |  "sha1", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "proc-macro2" | ||||||
|  | version = "1.0.49" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" | ||||||
|  | dependencies = [ | ||||||
|  |  "unicode-ident", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "quote" | ||||||
|  | version = "1.0.23" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" | ||||||
|  | dependencies = [ | ||||||
|  |  "proc-macro2", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ron" | ||||||
|  | version = "0.7.1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" | ||||||
|  | dependencies = [ | ||||||
|  |  "base64", | ||||||
|  |  "bitflags", | ||||||
|  |  "serde", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "rust-ini" | ||||||
|  | version = "0.18.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" | ||||||
|  | dependencies = [ | ||||||
|  |  "cfg-if", | ||||||
|  |  "ordered-multimap", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ryu" | ||||||
|  | version = "1.0.12" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "serde" | ||||||
|  | version = "1.0.152" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" | ||||||
|  | dependencies = [ | ||||||
|  |  "serde_derive", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "serde_derive" | ||||||
|  | version = "1.0.152" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" | ||||||
|  | dependencies = [ | ||||||
|  |  "proc-macro2", | ||||||
|  |  "quote", | ||||||
|  |  "syn", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "serde_json" | ||||||
|  | version = "1.0.91" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" | ||||||
|  | dependencies = [ | ||||||
|  |  "itoa", | ||||||
|  |  "ryu", | ||||||
|  |  "serde", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "sha1" | ||||||
|  | version = "0.10.5" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" | ||||||
|  | dependencies = [ | ||||||
|  |  "cfg-if", | ||||||
|  |  "cpufeatures", | ||||||
|  |  "digest", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "syn" | ||||||
|  | version = "1.0.107" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" | ||||||
|  | dependencies = [ | ||||||
|  |  "proc-macro2", | ||||||
|  |  "quote", | ||||||
|  |  "unicode-ident", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "thiserror" | ||||||
|  | version = "1.0.38" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" | ||||||
|  | dependencies = [ | ||||||
|  |  "thiserror-impl", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "thiserror-impl" | ||||||
|  | version = "1.0.38" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" | ||||||
|  | dependencies = [ | ||||||
|  |  "proc-macro2", | ||||||
|  |  "quote", | ||||||
|  |  "syn", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "toml" | ||||||
|  | version = "0.5.10" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" | ||||||
|  | dependencies = [ | ||||||
|  |  "serde", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "typenum" | ||||||
|  | version = "1.16.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ucd-trie" | ||||||
|  | version = "0.1.5" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "unicode-ident" | ||||||
|  | version = "1.0.6" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "version_check" | ||||||
|  | version = "0.9.4" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "wasi" | ||||||
|  | version = "0.11.0+wasi-snapshot-preview1" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "yaml-rust" | ||||||
|  | version = "0.4.5" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" | ||||||
|  | dependencies = [ | ||||||
|  |  "linked-hash-map", | ||||||
|  | ] | ||||||
							
								
								
									
										9
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | [package] | ||||||
|  | name = "hello" | ||||||
|  | version = "0.1.0" | ||||||
|  | edition = "2021" | ||||||
|  |  | ||||||
|  | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||||
|  |  | ||||||
|  | [dependencies] | ||||||
|  | config = "0.13.3" | ||||||
							
								
								
									
										11
									
								
								html/404.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								html/404.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>Hello!</title> | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     <h1>Oops!</h1> | ||||||
|  |     <p>Sorry, I don't know what you're asking for. No crabs here.</p> | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										11
									
								
								html/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								html/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>Hello!</title> | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     <h1>Hello!</h1> | ||||||
|  |     <p>Hi from Rust</p> | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										95
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | |||||||
|  | use std::{ | ||||||
|  |     thread, | ||||||
|  |     sync::{mpsc, Arc, Mutex}, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | pub struct ThreadPool { | ||||||
|  |    workers: Vec<Worker>,  | ||||||
|  |    sender: Option<mpsc::Sender<Job>>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Job = Box<dyn FnOnce() + Send + 'static>; | ||||||
|  |  | ||||||
|  | impl ThreadPool { | ||||||
|  |     ///Creates a new ThreadPool | ||||||
|  |     /// | ||||||
|  |     ///Panics if the number of threads is 0. | ||||||
|  |     /// | ||||||
|  |     /// # Panics | ||||||
|  |     /// | ||||||
|  |     /// The `new` function will panic if the size is zero. | ||||||
|  |     pub fn new(size: usize) -> ThreadPool { | ||||||
|  |         assert!(size > 0); | ||||||
|  |  | ||||||
|  |         let (sender, receiver) = mpsc::channel(); | ||||||
|  |  | ||||||
|  |         let receiver = Arc::new(Mutex::new(receiver)); | ||||||
|  |  | ||||||
|  |         //Preallocates the size of the Vector | ||||||
|  |         let mut workers = Vec::with_capacity(size); | ||||||
|  |  | ||||||
|  |         for id in 0..size { | ||||||
|  |             workers.push(Worker::new(id, Arc::clone(&receiver))); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         ThreadPool {  | ||||||
|  |             workers, | ||||||
|  |             sender: Some(sender), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     pub fn execute<F>(&self, f: F) | ||||||
|  |     where | ||||||
|  |         F: FnOnce() + Send + 'static, | ||||||
|  |         { | ||||||
|  |             let job = Box::new(f); | ||||||
|  |  | ||||||
|  |             self.sender.as_ref().unwrap().send(job).unwrap(); | ||||||
|  |         } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Drop for ThreadPool { | ||||||
|  |     fn drop(&mut self) { | ||||||
|  |         drop(self.sender.take()); | ||||||
|  |  | ||||||
|  |         for worker in &mut self.workers { | ||||||
|  |             println!("Shutting down worker {}", worker.id); | ||||||
|  |              | ||||||
|  |             if let Some(thread) = worker.thread.take() { | ||||||
|  |                 thread.join().unwrap(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct Worker {  | ||||||
|  |     id: usize, | ||||||
|  |     thread: Option<thread::JoinHandle<()>>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Worker { | ||||||
|  |     fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker { | ||||||
|  |         let thread = thread::spawn(move || loop { | ||||||
|  |             let message = receiver.lock().expect("Lock's been poisoned, another thread panicked").recv(); | ||||||
|  |  | ||||||
|  |             match message { | ||||||
|  |                 Ok(job) => { | ||||||
|  |                     println!("Worker {id} got a job; executing !"); | ||||||
|  |                     job(); | ||||||
|  |                 } | ||||||
|  |                 Err(_) => { | ||||||
|  |                     println!("Worker {id} disconnected, shutting down"); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         Worker {  | ||||||
|  |             id,  | ||||||
|  |             thread: Some(thread), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										98
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | |||||||
|  | //Nice way to import ! | ||||||
|  | use hello::{ | ||||||
|  |     ThreadPool, | ||||||
|  | }; | ||||||
|  | use std::{ | ||||||
|  |     fs, | ||||||
|  |     io::{prelude::*, BufReader}, | ||||||
|  |     net::{TcpListener, TcpStream}, | ||||||
|  |     collections::HashMap, | ||||||
|  | }; | ||||||
|  | use config::Config; | ||||||
|  |  | ||||||
|  | fn main() { | ||||||
|  |     //building config | ||||||
|  |     let cfg = Config::builder() | ||||||
|  |         .add_source(config::File::with_name("websrv_conf")) | ||||||
|  |         .build() | ||||||
|  |         .unwrap(); | ||||||
|  |  | ||||||
|  |     let cfg = cfg.try_deserialize::<HashMap<String, String>>().expect("Could not deserialize configuration"); | ||||||
|  |     println!("Starting with configuration: "); | ||||||
|  |     for conf in &cfg { | ||||||
|  |         println!("{:?}", conf); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let nbr_of_threads: usize = cfg | ||||||
|  |         .get("threads") | ||||||
|  |         .expect("Threads not found in config") | ||||||
|  |         .parse() | ||||||
|  |         .unwrap(); | ||||||
|  |  | ||||||
|  |     let default_bind_addr = String::from("0.0.0.0:7878"); | ||||||
|  |     let bind_addr = cfg | ||||||
|  |         .get("bind_addr") | ||||||
|  |         .unwrap_or(&default_bind_addr) | ||||||
|  |         .to_string(); | ||||||
|  |  | ||||||
|  |     let default_webpage = String::from("index.html"); | ||||||
|  |     let webpage = cfg | ||||||
|  |         .get("webpage") | ||||||
|  |         .unwrap_or(&default_webpage) | ||||||
|  |         .to_string(); | ||||||
|  |  | ||||||
|  |     let listener = TcpListener::bind(bind_addr).unwrap(); | ||||||
|  |  | ||||||
|  |     let pool = ThreadPool::new(nbr_of_threads); | ||||||
|  |  | ||||||
|  |     for stream in listener.incoming() { | ||||||
|  |         let stream = stream.unwrap(); | ||||||
|  |         let webp = webpage.clone(); | ||||||
|  |  | ||||||
|  |         pool.execute(move || { | ||||||
|  |            handle_connection(stream, webp); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     println!("Shutting down."); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn analyze_request_line(line: Vec<&str>) -> HashMap<String, String>{ | ||||||
|  |     let req = line[0]; | ||||||
|  |     let page = line[1]; | ||||||
|  |     let proto = line[2]; | ||||||
|  |  | ||||||
|  |     let mut analyzed = HashMap::new(); | ||||||
|  |     analyzed.insert(String::from("req"), req.to_string()); | ||||||
|  |     analyzed.insert(String::from("page"), page.to_string()); | ||||||
|  |     analyzed.insert(String::from("proto"), proto.to_string()); | ||||||
|  |  | ||||||
|  |     return analyzed; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn handle_connection(mut stream: TcpStream, webpage: String) { | ||||||
|  |     let buf_reader = BufReader::new(&mut stream); | ||||||
|  |     let request_line = buf_reader.lines().next().unwrap().unwrap(); | ||||||
|  |      | ||||||
|  |     let request_analyze: Vec<&str> = request_line.split_whitespace().collect(); | ||||||
|  |     println!("!{:?}", request_analyze); | ||||||
|  |     let analyzed = analyze_request_line(request_analyze); | ||||||
|  |  | ||||||
|  |     //We analyzed the request, now to use it | ||||||
|  |  | ||||||
|  |     let (status_line, filename) = match &request_line[..] { | ||||||
|  |         "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", &webpage[..]), | ||||||
|  |         _ => ("HTTP/1.1 404 NOT FOUND", "404.html"), | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     let contents = fs::read_to_string(format!("./html/{filename}")).unwrap(); | ||||||
|  |     let length = contents.len(); | ||||||
|  |  | ||||||
|  |     let response = format!( | ||||||
|  |         "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}" | ||||||
|  |         ); | ||||||
|  |     stream.write_all(response.as_bytes()).unwrap(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								websrv_conf.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								websrv_conf.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | threads = 10 | ||||||
|  | webpage = "index.html" | ||||||
|  | bind_addr = "0.0.0.0:7878" | ||||||
		Reference in New Issue
	
	Block a user