itsi 0.1.14 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +126 -272
- data/Cargo.toml +6 -0
- data/crates/itsi_error/Cargo.toml +1 -0
- data/crates/itsi_error/src/lib.rs +100 -10
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
- data/crates/itsi_server/Cargo.toml +12 -11
- data/crates/itsi_server/src/default_responses/html/401.html +68 -0
- data/crates/itsi_server/src/default_responses/html/403.html +68 -0
- data/crates/itsi_server/src/default_responses/html/404.html +68 -0
- data/crates/itsi_server/src/default_responses/html/413.html +71 -0
- data/crates/itsi_server/src/default_responses/html/429.html +68 -0
- data/crates/itsi_server/src/default_responses/html/500.html +71 -0
- data/crates/itsi_server/src/default_responses/html/502.html +71 -0
- data/crates/itsi_server/src/default_responses/html/503.html +68 -0
- data/crates/itsi_server/src/default_responses/html/504.html +69 -0
- data/crates/itsi_server/src/default_responses/html/index.html +238 -0
- data/crates/itsi_server/src/default_responses/json/401.json +6 -0
- data/crates/itsi_server/src/default_responses/json/403.json +6 -0
- data/crates/itsi_server/src/default_responses/json/404.json +6 -0
- data/crates/itsi_server/src/default_responses/json/413.json +6 -0
- data/crates/itsi_server/src/default_responses/json/429.json +6 -0
- data/crates/itsi_server/src/default_responses/json/500.json +6 -0
- data/crates/itsi_server/src/default_responses/json/502.json +6 -0
- data/crates/itsi_server/src/default_responses/json/503.json +6 -0
- data/crates/itsi_server/src/default_responses/json/504.json +6 -0
- data/crates/itsi_server/src/default_responses/mod.rs +11 -0
- data/crates/itsi_server/src/lib.rs +58 -26
- data/crates/itsi_server/src/prelude.rs +2 -0
- data/crates/itsi_server/src/ruby_types/README.md +21 -0
- data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
- data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
- data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
- data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
- data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
- data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
- data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
- data/crates/itsi_server/src/server/binds/mod.rs +4 -0
- data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
- data/crates/itsi_server/src/server/http_message_types.rs +97 -0
- data/crates/itsi_server/src/server/io_stream.rs +2 -1
- data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
- data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
- data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
- data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
- data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
- data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
- data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
- data/crates/itsi_server/src/server/mod.rs +3 -9
- data/crates/itsi_server/src/server/process_worker.rs +21 -3
- data/crates/itsi_server/src/server/request_job.rs +2 -2
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
- data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
- data/crates/itsi_server/src/server/signal.rs +24 -41
- data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
- data/crates/itsi_server/src/server/thread_worker.rs +59 -28
- data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
- data/crates/itsi_server/src/services/mime_types.rs +1416 -0
- data/crates/itsi_server/src/services/mod.rs +6 -0
- data/crates/itsi_server/src/services/password_hasher.rs +83 -0
- data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
- data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
- data/crates/itsi_tracing/src/lib.rs +145 -55
- data/{Itsi.rb → foo/Itsi.rb} +6 -9
- data/gems/scheduler/Cargo.lock +7 -0
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/test/helpers/test_helper.rb +0 -1
- data/gems/scheduler/test/test_address_resolve.rb +0 -1
- data/gems/scheduler/test/test_network_io.rb +1 -1
- data/gems/scheduler/test/test_process_wait.rb +0 -1
- data/gems/server/Cargo.lock +126 -272
- data/gems/server/exe/itsi +65 -19
- data/gems/server/itsi-server.gemspec +4 -3
- data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
- data/gems/server/lib/itsi/http_request.rb +117 -17
- data/gems/server/lib/itsi/http_response.rb +2 -0
- data/gems/server/lib/itsi/passfile.rb +109 -0
- data/gems/server/lib/itsi/server/config/dsl.rb +171 -99
- data/gems/server/lib/itsi/server/config.rb +58 -23
- data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
- data/gems/server/lib/itsi/server/default_app/index.html +113 -89
- data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
- data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
- data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
- data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
- data/gems/server/lib/itsi/server/route_tester.rb +107 -0
- data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
- data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
- data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +82 -12
- data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
- data/gems/server/lib/shell_completions/completions.rb +26 -0
- data/gems/server/test/helpers/test_helper.rb +2 -1
- data/lib/itsi/version.rb +1 -1
- data/sandbox/README.md +5 -0
- data/sandbox/itsi_file/Gemfile +4 -2
- data/sandbox/itsi_file/Gemfile.lock +48 -6
- data/sandbox/itsi_file/Itsi.rb +327 -129
- data/sandbox/itsi_file/call.json +1 -0
- data/sandbox/itsi_file/echo_client/Gemfile +10 -0
- data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
- data/sandbox/itsi_file/echo_client/README.md +95 -0
- data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
- data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
- data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
- data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
- data/sandbox/itsi_sandbox_async/config.ru +0 -1
- data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
- data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
- data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
- data/sandbox/itsi_sinatra/app.rb +0 -1
- data/sandbox/static_files/.env +1 -0
- data/sandbox/static_files/404.html +25 -0
- data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
- data/sandbox/static_files/about.html +68 -0
- data/sandbox/static_files/tiny.html +1 -0
- data/sandbox/static_files/writebook.zip +0 -0
- data/tasks.txt +28 -33
- metadata +87 -26
- data/crates/itsi_error/src/from.rs +0 -68
- data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
- data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
- data/crates/itsi_server/src/server/itsi_service.rs +0 -172
- data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
- data/crates/itsi_server/src/server/types.rs +0 -43
- data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
- data/sandbox/itsi_file/public/assets/index.html +0 -1
- /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
- /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
- /data/crates/itsi_server/src/{server → services}/cache_store.rs +0 -0
@@ -1,31 +1,121 @@
|
|
1
|
-
pub
|
1
|
+
pub use anyhow::Context;
|
2
|
+
use magnus::Error as MagnusError;
|
3
|
+
use magnus::{
|
4
|
+
error::ErrorType,
|
5
|
+
exception::{self, arg_error, standard_error},
|
6
|
+
};
|
2
7
|
use thiserror::Error;
|
3
8
|
|
9
|
+
pub static CLIENT_CONNECTION_CLOSED: &str = "Client disconnected";
|
4
10
|
pub type Result<T> = std::result::Result<T, ItsiError>;
|
5
11
|
|
6
|
-
#[derive(Error, Debug
|
12
|
+
#[derive(Error, Debug)]
|
7
13
|
pub enum ItsiError {
|
8
|
-
#[error("Invalid input {0}")]
|
14
|
+
#[error("Invalid input: {0}")]
|
9
15
|
InvalidInput(String),
|
10
|
-
|
16
|
+
|
17
|
+
#[error("Internal server error: {0}")]
|
11
18
|
InternalServerError(String),
|
12
|
-
|
19
|
+
|
20
|
+
#[error("Unsupported protocol: {0}")]
|
13
21
|
UnsupportedProtocol(String),
|
22
|
+
|
14
23
|
#[error("Argument error: {0}")]
|
15
24
|
ArgumentError(String),
|
25
|
+
|
16
26
|
#[error("Client Connection Closed")]
|
17
27
|
ClientConnectionClosed,
|
18
|
-
|
28
|
+
|
29
|
+
#[error("Internal Error")]
|
30
|
+
InternalError(String),
|
31
|
+
|
32
|
+
#[error(transparent)]
|
33
|
+
Io(#[from] std::io::Error),
|
34
|
+
|
35
|
+
#[error(transparent)]
|
36
|
+
Rcgen(#[from] rcgen::Error),
|
37
|
+
|
38
|
+
#[error(transparent)]
|
39
|
+
HttpParse(#[from] httparse::Error),
|
40
|
+
|
41
|
+
#[error(transparent)]
|
42
|
+
NixErrno(#[from] nix::errno::Errno),
|
43
|
+
|
44
|
+
#[error(transparent)]
|
45
|
+
Nul(#[from] std::ffi::NulError),
|
46
|
+
|
47
|
+
#[error("Jump: {0}")]
|
19
48
|
Jump(String),
|
49
|
+
|
20
50
|
#[error("Break")]
|
21
|
-
Break
|
51
|
+
Break,
|
52
|
+
|
22
53
|
#[error("Pass")]
|
23
|
-
Pass
|
54
|
+
Pass,
|
55
|
+
|
56
|
+
#[error(transparent)]
|
57
|
+
Anyhow(#[from] anyhow::Error),
|
58
|
+
}
|
59
|
+
|
60
|
+
impl From<magnus::Error> for ItsiError {
|
61
|
+
fn from(err: magnus::Error) -> Self {
|
62
|
+
match err.error_type() {
|
63
|
+
ErrorType::Jump(tag) => ItsiError::Jump(tag.to_string()),
|
64
|
+
ErrorType::Error(_exception_class, cow) => ItsiError::ArgumentError(cow.to_string()),
|
65
|
+
ErrorType::Exception(exception) => ItsiError::ArgumentError(exception.to_string()),
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
pub trait IntoMagnusError {
|
71
|
+
fn into_magnus_error(self) -> MagnusError;
|
72
|
+
}
|
73
|
+
|
74
|
+
impl<T: std::error::Error> IntoMagnusError for T {
|
75
|
+
fn into_magnus_error(self) -> MagnusError {
|
76
|
+
MagnusError::new(standard_error(), self.to_string())
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
impl From<&str> for ItsiError {
|
81
|
+
fn from(s: &str) -> Self {
|
82
|
+
ItsiError::InternalError(s.to_owned())
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
impl From<String> for ItsiError {
|
87
|
+
fn from(s: String) -> Self {
|
88
|
+
ItsiError::InternalError(s)
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
impl From<ItsiError> for magnus::Error {
|
93
|
+
fn from(err: ItsiError) -> Self {
|
94
|
+
match err {
|
95
|
+
ItsiError::InvalidInput(msg) => magnus::Error::new(arg_error(), msg),
|
96
|
+
ItsiError::InternalServerError(msg) => magnus::Error::new(standard_error(), msg),
|
97
|
+
ItsiError::InternalError(msg) => magnus::Error::new(standard_error(), msg),
|
98
|
+
ItsiError::UnsupportedProtocol(msg) => magnus::Error::new(arg_error(), msg),
|
99
|
+
ItsiError::ArgumentError(msg) => magnus::Error::new(arg_error(), msg),
|
100
|
+
ItsiError::Jump(msg) => magnus::Error::new(exception::local_jump_error(), msg),
|
101
|
+
ItsiError::ClientConnectionClosed => {
|
102
|
+
magnus::Error::new(exception::eof_error(), CLIENT_CONNECTION_CLOSED)
|
103
|
+
}
|
104
|
+
ItsiError::Break => magnus::Error::new(exception::interrupt(), "Break"),
|
105
|
+
ItsiError::Pass => magnus::Error::new(exception::interrupt(), "Pass"),
|
106
|
+
ItsiError::Io(err) => err.into_magnus_error(),
|
107
|
+
ItsiError::Rcgen(err) => err.into_magnus_error(),
|
108
|
+
ItsiError::HttpParse(err) => err.into_magnus_error(),
|
109
|
+
ItsiError::NixErrno(err) => err.into_magnus_error(),
|
110
|
+
ItsiError::Nul(err) => err.into_magnus_error(),
|
111
|
+
ItsiError::Anyhow(err) => err.into_magnus_error(),
|
112
|
+
}
|
113
|
+
}
|
24
114
|
}
|
25
115
|
|
26
116
|
impl ItsiError {
|
27
|
-
pub fn
|
28
|
-
ItsiError::
|
117
|
+
pub fn new(error: impl Send + Sync + 'static + std::fmt::Display) -> Self {
|
118
|
+
ItsiError::InternalError(format!("{}", error))
|
29
119
|
}
|
30
120
|
}
|
31
121
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[package]
|
2
2
|
name = "itsi-server"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.19"
|
4
4
|
edition = "2021"
|
5
5
|
authors = ["Wouter Coppieters <wc@pico.net.nz>"]
|
6
6
|
license = "MIT"
|
@@ -11,33 +11,31 @@ crate-type = ["cdylib"]
|
|
11
11
|
|
12
12
|
[dependencies]
|
13
13
|
async-compression = { version = "0.4.21", features = [
|
14
|
+
"futures-io",
|
14
15
|
"tokio",
|
15
16
|
"zstd",
|
16
17
|
"brotli",
|
17
18
|
"deflate",
|
18
19
|
"gzip",
|
20
|
+
"zlib",
|
19
21
|
] }
|
20
22
|
async-channel = "2.3.1"
|
21
23
|
async-trait = "0.1.87"
|
24
|
+
bcrypt = "0.17.0"
|
22
25
|
base64 = "0.22.1"
|
23
26
|
bytes = "1.3"
|
24
27
|
chrono = "0.4.35"
|
25
|
-
crossbeam = "0.8.4"
|
26
|
-
dashmap = "6.1.0"
|
27
28
|
derive_more = { version = "2.0.1", features = ["debug"] }
|
28
29
|
dirs = "6.0.0"
|
29
30
|
either = "1.15.0"
|
30
|
-
fnv = "1.0.7"
|
31
31
|
fs2 = "0.4.3"
|
32
32
|
futures = "0.3.31"
|
33
33
|
globset = "0.4.16"
|
34
|
-
hmac = "0.12.1"
|
35
34
|
http = "1.3.1"
|
36
35
|
http-body-util = "0.1.2"
|
37
36
|
httpdate = "1.0.3"
|
38
37
|
httparse = "1.10.1"
|
39
38
|
hyper = { version = "1.5.0", features = ["full", "server", "http1", "http2"] }
|
40
|
-
hyper-staticfile = "0.10.1"
|
41
39
|
hyper-util = { version = "0.1.10", features = ["full"] }
|
42
40
|
itsi_error = { path = "../itsi_error" }
|
43
41
|
itsi_rb_helpers = { path = "../itsi_rb_helpers" }
|
@@ -57,12 +55,12 @@ num_cpus = "1.16.0"
|
|
57
55
|
parking_lot = "0.12.3"
|
58
56
|
pin-project = "1.1.9"
|
59
57
|
rand = "0.9.0"
|
60
|
-
rb-sys = "0.9.111"
|
61
58
|
rcgen = { version = "0.13.2", features = ["x509-parser", "pem"] }
|
62
59
|
regex = "1.11.1"
|
63
|
-
reqwest = { version = "0.12.15", features = [
|
64
|
-
|
65
|
-
|
60
|
+
reqwest = { version = "0.12.15", features = [
|
61
|
+
"stream",
|
62
|
+
"rustls-tls",
|
63
|
+
], default-features = false }
|
66
64
|
redis = { version = "0.29.2", features = [
|
67
65
|
"tokio-comp",
|
68
66
|
"r2d2",
|
@@ -85,5 +83,8 @@ tokio-stream = "0.1.17"
|
|
85
83
|
tokio-util = "0.7.13"
|
86
84
|
tracing = "0.1.41"
|
87
85
|
url = "2.5.4"
|
88
|
-
uuid = "1.16.0"
|
89
86
|
md5 = "0.7.0"
|
87
|
+
percent-encoding = "2.3.1"
|
88
|
+
sha-crypt = "0.5.0"
|
89
|
+
argon2 = "0.5.3"
|
90
|
+
core_affinity = "0.8.3"
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>401 Unauthorized</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>401 Unauthorized</h1>
|
63
|
+
<p>You are not authorized to access this page.</p>
|
64
|
+
<p><a href="/">Return Home</a></p>
|
65
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
66
|
+
</div>
|
67
|
+
</body>
|
68
|
+
</html>
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>403 Forbidden</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>403</h1>
|
63
|
+
<p>You are forbidden to access this page.</p>
|
64
|
+
<p><a href="/">Return Home</a></p>
|
65
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
66
|
+
</div>
|
67
|
+
</body>
|
68
|
+
</html>
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>Error – Page Not Found</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>404</h1>
|
63
|
+
<p>We’re sorry, but we couldn’t find the page you were looking for.</p>
|
64
|
+
<p><a href="/">Return Home</a></p>
|
65
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
66
|
+
</div>
|
67
|
+
</body>
|
68
|
+
</html>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>Upload Limit Exceeded</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>413</h1>
|
63
|
+
<p>
|
64
|
+
The content you are trying too upload is too large. Please try again
|
65
|
+
with a smaller file.
|
66
|
+
</p>
|
67
|
+
<p><a href="/">Return Home</a></p>
|
68
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
69
|
+
</div>
|
70
|
+
</body>
|
71
|
+
</html>
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>Rate Limit Exceeded</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>429</h1>
|
63
|
+
<p>Slow down! You've exceeded your rate limit.</p>
|
64
|
+
<p><a href="/">Return Home</a></p>
|
65
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
66
|
+
</div>
|
67
|
+
</body>
|
68
|
+
</html>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<title>Internal Server Error</title>
|
7
|
+
<style>
|
8
|
+
:root {
|
9
|
+
--bg-color: #f0f2f5;
|
10
|
+
--text-color: #333;
|
11
|
+
--accent-color: #0052cc;
|
12
|
+
--link-color: #0052cc;
|
13
|
+
}
|
14
|
+
body {
|
15
|
+
margin: 0;
|
16
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
17
|
+
background: var(--bg-color);
|
18
|
+
color: var(--text-color);
|
19
|
+
display: flex;
|
20
|
+
align-items: center;
|
21
|
+
justify-content: center;
|
22
|
+
min-height: 100vh;
|
23
|
+
padding: 2rem;
|
24
|
+
}
|
25
|
+
.error-container {
|
26
|
+
text-align: center;
|
27
|
+
max-width: 800px;
|
28
|
+
width: 100%;
|
29
|
+
}
|
30
|
+
h1 {
|
31
|
+
font-size: 5rem;
|
32
|
+
font-weight: 300;
|
33
|
+
margin-bottom: 0.5rem;
|
34
|
+
}
|
35
|
+
p {
|
36
|
+
font-size: 1.5rem;
|
37
|
+
line-height: 1.6;
|
38
|
+
margin-bottom: 2rem;
|
39
|
+
}
|
40
|
+
a {
|
41
|
+
font-size: 1rem;
|
42
|
+
text-decoration: none;
|
43
|
+
color: var(--link-color);
|
44
|
+
border-bottom: 1px solid transparent;
|
45
|
+
transition: border-color 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
a:hover {
|
48
|
+
border-color: var(--link-color);
|
49
|
+
}
|
50
|
+
@media (max-width: 480px) {
|
51
|
+
h1 {
|
52
|
+
font-size: 3.5rem;
|
53
|
+
}
|
54
|
+
p {
|
55
|
+
font-size: 1.2rem;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
<div class="error-container">
|
62
|
+
<h1>500</h1>
|
63
|
+
<p>
|
64
|
+
The server encountered an unexpected error that prevented it from
|
65
|
+
fulfilling the request.
|
66
|
+
</p>
|
67
|
+
<p><a href="/">Return Home</a></p>
|
68
|
+
<p><a href="javascript:history.back()">Go Back</a></p>
|
69
|
+
</div>
|
70
|
+
</body>
|
71
|
+
</html>
|