error response
This commit is contained in:
parent
3370c53d3e
commit
a8dd8a77a5
@ -12,13 +12,13 @@ server {
|
|||||||
|
|
||||||
error_page 400 ./htdocs/error_pages/400.html;
|
error_page 400 ./htdocs/error_pages/400.html;
|
||||||
error_page 404 ./htdocs/error_pages/404.html;
|
error_page 404 ./htdocs/error_pages/404.html;
|
||||||
error_page 403 /403.html;
|
error_page 404 ./htdocs/error_pages/404.html;
|
||||||
error_page 404 /404.html;
|
error_page 403 ./htdocs/error_pages/403.html;
|
||||||
error_page 405 /405.html;
|
error_page 405 ./htdocs/error_pages/405.html;
|
||||||
error_page 413 /413.html;
|
error_page 413 ./htdocs/error_pages/413.html;
|
||||||
error_page 500 /500.html;
|
error_page 500 ./htdocs/error_pages/500.html;
|
||||||
error_page 502 /502.html;
|
error_page 502 ./htdocs/error_pages/502.html;
|
||||||
error_page 504 /504.html;
|
error_page 504 ./htdocs/error_pages/504.html;
|
||||||
|
|
||||||
client_max_body_size 1M;
|
client_max_body_size 1M;
|
||||||
|
|
||||||
@ -42,6 +42,13 @@ server {
|
|||||||
allowed_methods GET;
|
allowed_methods GET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /test {
|
||||||
|
root ./htdocs/site-1/tester;
|
||||||
|
autoindex off;
|
||||||
|
index index.html;
|
||||||
|
allowed_methods GET;
|
||||||
|
}
|
||||||
|
|
||||||
# cgi_enabled yes;
|
# cgi_enabled yes;
|
||||||
# cgi_ext .php /usr/bin/php-cgi;
|
# cgi_ext .php /usr/bin/php-cgi;
|
||||||
}
|
}
|
||||||
|
|||||||
73
htdocs/error_pages/401.html
Normal file
73
htdocs/error_pages/401.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>401 Unauthorized</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">401</div>
|
||||||
|
<div class="message">Access Denied!<br>Authentication is required to access this resource.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/403.html
Normal file
73
htdocs/error_pages/403.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">403</div>
|
||||||
|
<div class="message">Forbidden!<br>You don't have permission to access this resource.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/405.html
Normal file
73
htdocs/error_pages/405.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>405 Method Not Allowed</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">405</div>
|
||||||
|
<div class="message">Method Not Allowed!<br>The request method is not supported for this resource.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/408.html
Normal file
73
htdocs/error_pages/408.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>408 Request Timeout</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">408</div>
|
||||||
|
<div class="message">Request Timeout!<br>The server timed out waiting for the request.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/411.html
Normal file
73
htdocs/error_pages/411.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>411 Length Required</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">411</div>
|
||||||
|
<div class="message">Length Required!<br>The request must specify the content length.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/413.html
Normal file
73
htdocs/error_pages/413.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>413 Payload Too Large</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">413</div>
|
||||||
|
<div class="message">Payload Too Large!<br>The request entity is larger than the server is able to process.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/414.html
Normal file
73
htdocs/error_pages/414.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>414 URI Too Long</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">414</div>
|
||||||
|
<div class="message">URI Too Long!<br>The request URI is longer than the server is willing to interpret.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/415.html
Normal file
73
htdocs/error_pages/415.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>415 Unsupported Media Type</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">415</div>
|
||||||
|
<div class="message">Unsupported Media Type!<br>The media format of the requested data is not supported.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/500.html
Normal file
73
htdocs/error_pages/500.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>500 Internal Server Error</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">500</div>
|
||||||
|
<div class="message">Internal Server Error!<br>Something went wrong on our end. Please try again later.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/501.html
Normal file
73
htdocs/error_pages/501.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>501 Not Implemented</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">501</div>
|
||||||
|
<div class="message">Not Implemented!<br>The server does not support the functionality required to fulfill the request.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/502.html
Normal file
73
htdocs/error_pages/502.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>502 Bad Gateway</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">502</div>
|
||||||
|
<div class="message">Bad Gateway!<br>The server received an invalid response from an upstream server.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/503.html
Normal file
73
htdocs/error_pages/503.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>503 Service Unavailable</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">503</div>
|
||||||
|
<div class="message">Service Unavailable!<br>The server is temporarily overloaded or under maintenance.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htdocs/error_pages/504.html
Normal file
73
htdocs/error_pages/504.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>504 Gateway Timeout</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: linear-gradient(135deg, #ff6a6a 0%, #ffd86a 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: 'Segoe UI', 'Arial', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
background: rgba(255,255,255,0.85);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0,0,0,0.18);
|
||||||
|
padding: 40px 32px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ff6a6a;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 8px #ffd86a88;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
background: #ffd86a;
|
||||||
|
color: #222;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
box-shadow: 0 2px 8px #ff6a6a44;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.home-link:hover {
|
||||||
|
background: #ff6a6a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.container {
|
||||||
|
padding: 24px 8px;
|
||||||
|
max-width: 95vw;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">504</div>
|
||||||
|
<div class="message">Gateway Timeout!<br>The server did not receive a timely response from an upstream server.</div>
|
||||||
|
<a class="home-link" href="/">Go Home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
htdocs/site-1/tester/test.html
Normal file
11
htdocs/site-1/tester/test.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Test Page</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>This is a test HTML page</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -35,15 +35,6 @@ Client::~Client()
|
|||||||
server_.remove(*clientSocket_);
|
server_.remove(*clientSocket_);
|
||||||
};
|
};
|
||||||
|
|
||||||
int Client::getStatusCode() const noexcept
|
|
||||||
{
|
|
||||||
return statusCode_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::setStatusCode(int code)
|
|
||||||
{
|
|
||||||
statusCode_ = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASocket &Client::getSocket(int fd) const
|
ASocket &Client::getSocket(int fd) const
|
||||||
{
|
{
|
||||||
@ -191,7 +182,7 @@ void Client::poll() const
|
|||||||
{
|
{
|
||||||
Log::info("Response is ready to be sent to client, fd: " + std::to_string(clientSocket_->getFd()));
|
Log::info("Response is ready to be sent to client, fd: " + std::to_string(clientSocket_->getFd()));
|
||||||
clientSocket_->setCallback([this]() { respond(); });
|
clientSocket_->setCallback([this]() { respond(); });
|
||||||
server_.responseReady(clientSocket_->getFd());
|
server_.writable(clientSocket_->getFd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,24 +34,24 @@ class Client
|
|||||||
|
|
||||||
void request();
|
void request();
|
||||||
void respond() const;
|
void respond() const;
|
||||||
|
void poll() const;
|
||||||
|
|
||||||
void writeToCgi();
|
void writeToCgi();
|
||||||
void readFromCgi();
|
void readFromCgi();
|
||||||
|
|
||||||
void poll() const;
|
|
||||||
|
|
||||||
[[nodiscard]] int getStatusCode() const noexcept;
|
// [[nodiscard]] int getStatusCode() const noexcept;
|
||||||
|
|
||||||
[[nodiscard]] ASocket &getSocket(int fd = -1) const;
|
[[nodiscard]] ASocket &getSocket(int fd = -1) const;
|
||||||
|
|
||||||
void setStatusCode(int code);
|
// void setStatusCode(int code);
|
||||||
void setCgiSockets(std::unique_ptr<CgiSocket> cgiStdIn, std::unique_ptr<CgiSocket> cgiStdOut);
|
void setCgiSockets(std::unique_ptr<CgiSocket> cgiStdIn, std::unique_ptr<CgiSocket> cgiStdOut);
|
||||||
|
|
||||||
[[nodiscard]] HttpRequest &getHttpRequest() const noexcept;
|
[[nodiscard]] HttpRequest &getHttpRequest() const noexcept;
|
||||||
[[nodiscard]] HttpResponse &getHttpResponse() const noexcept;
|
[[nodiscard]] HttpResponse &getHttpResponse() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int statusCode_ = Http::StatusCode::OK;
|
// int statusCode_ = Http::StatusCode::OK;
|
||||||
constexpr static size_t bufferSize_ = 8192; // 8KB buffer for reading CGI output
|
constexpr static size_t bufferSize_ = 8192; // 8KB buffer for reading CGI output
|
||||||
std::unique_ptr<HttpRequest> httpRequest_;
|
std::unique_ptr<HttpRequest> httpRequest_;
|
||||||
std::unique_ptr<HttpResponse> httpResponse_;
|
std::unique_ptr<HttpResponse> httpResponse_;
|
||||||
|
|||||||
@ -20,6 +20,7 @@ void ErrorHandler::createErrorResponse(uint16_t statusCode, HttpResponse &respon
|
|||||||
response.addHeader("Content-Type", "text/html");
|
response.addHeader("Content-Type", "text/html");
|
||||||
response.addHeader("Connection", "close");
|
response.addHeader("Connection", "close");
|
||||||
response.appendBody(generateErrorPage(statusCode, config));
|
response.appendBody(generateErrorPage(statusCode, config));
|
||||||
|
response.setComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorHandler::generateErrorPage(uint16_t statusCode, const AConfig *config)
|
std::string ErrorHandler::generateErrorPage(uint16_t statusCode, const AConfig *config)
|
||||||
|
|||||||
@ -23,6 +23,7 @@ FileHandler::FileHandler(const HttpRequest &request, HttpResponse &response)
|
|||||||
void FileHandler::handleFile(const std::string &filepath) const
|
void FileHandler::handleFile(const std::string &filepath) const
|
||||||
{
|
{
|
||||||
Log::trace(LOCATION);
|
Log::trace(LOCATION);
|
||||||
|
Log::debug("Requested path is a file: " + filepath);
|
||||||
// auto response = std::make_unique<HttpResponse>();
|
// auto response = std::make_unique<HttpResponse>();
|
||||||
|
|
||||||
std::string extension = FileUtils::getExtension(filepath);
|
std::string extension = FileUtils::getExtension(filepath);
|
||||||
@ -45,6 +46,7 @@ void FileHandler::handleFile(const std::string &filepath) const
|
|||||||
void FileHandler::handleDirectory(const std::string &dirpath, ResourceType type) const
|
void FileHandler::handleDirectory(const std::string &dirpath, ResourceType type) const
|
||||||
{
|
{
|
||||||
Log::trace(LOCATION);
|
Log::trace(LOCATION);
|
||||||
|
Log::debug("Requested path is a directory: " + dirpath);
|
||||||
|
|
||||||
if (type == DIRECTORY_INDEX)
|
if (type == DIRECTORY_INDEX)
|
||||||
{
|
{
|
||||||
@ -72,7 +74,13 @@ void FileHandler::handleDirectory(const std::string &dirpath, ResourceType type)
|
|||||||
void FileHandler::handle() const
|
void FileHandler::handle() const
|
||||||
{
|
{
|
||||||
Log::trace(LOCATION);
|
Log::trace(LOCATION);
|
||||||
|
if (!uri_.isValid())
|
||||||
|
{
|
||||||
|
ErrorHandler::createErrorResponse(Http::StatusCode::NOT_FOUND, response_, config_);
|
||||||
|
return;
|
||||||
|
}
|
||||||
std::string filepath = uri_.getFullPath();
|
std::string filepath = uri_.getFullPath();
|
||||||
|
Log::debug("Handling file request for path: " + filepath);
|
||||||
ResourceType resourceType = getResourceType(filepath);
|
ResourceType resourceType = getResourceType(filepath);
|
||||||
|
|
||||||
switch (resourceType)
|
switch (resourceType)
|
||||||
|
|||||||
@ -17,6 +17,7 @@ URI::URI(const HttpRequest &request, const ServerConfig &serverConfig)
|
|||||||
{
|
{
|
||||||
Log::trace(LOCATION);
|
Log::trace(LOCATION);
|
||||||
parseUri(request.getTarget());
|
parseUri(request.getTarget());
|
||||||
|
Log::debug("Parsed URI: " + uriTrimmed_, {{"ConfigType", config_->getType()}});
|
||||||
parseFullpath();
|
parseFullpath();
|
||||||
|
|
||||||
authority_ = request.getHeaders().getHost().value();
|
authority_ = request.getHeaders().getHost().value();
|
||||||
@ -84,17 +85,17 @@ void URI::parseFullpath()
|
|||||||
|
|
||||||
for (const auto &segment : uriSegments)
|
for (const auto &segment : uriSegments)
|
||||||
{
|
{
|
||||||
std::string curDir = FileUtils::joinPath(dir_, segment);
|
std::string currentPath = FileUtils::joinPath(dir_, segment);
|
||||||
if (segment.empty())
|
if (segment.empty())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FileUtils::isFile(curDir) && baseName_.empty())
|
if (FileUtils::isFile(currentPath) && baseName_.empty())
|
||||||
{
|
{
|
||||||
baseName_ = segment;
|
baseName_ = segment;
|
||||||
}
|
}
|
||||||
else if (FileUtils::isDirectory(curDir))
|
else if (FileUtils::isDirectory(currentPath))
|
||||||
{
|
{
|
||||||
dir_ = FileUtils::joinPath(dir_, segment);
|
dir_ = FileUtils::joinPath(dir_, segment);
|
||||||
}
|
}
|
||||||
@ -102,6 +103,12 @@ void URI::parseFullpath()
|
|||||||
{
|
{
|
||||||
pathInfo_ = FileUtils::joinPath(pathInfo_, baseName_);
|
pathInfo_ = FileUtils::joinPath(pathInfo_, baseName_);
|
||||||
}
|
}
|
||||||
|
else // not file or dir, and no baseName yet
|
||||||
|
{
|
||||||
|
valid_ = false;
|
||||||
|
Log::warning("Invalid path segment encountered: " + currentPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fullPath_ = FileUtils::joinPath(dir_, baseName_);
|
fullPath_ = FileUtils::joinPath(dir_, baseName_);
|
||||||
}
|
}
|
||||||
@ -146,7 +153,7 @@ bool URI::isDirectory() const noexcept
|
|||||||
|
|
||||||
bool URI::isValid() const noexcept
|
bool URI::isValid() const noexcept
|
||||||
{
|
{
|
||||||
return FileUtils::isValidPath(fullPath_);
|
return valid_ && FileUtils::isValidPath(fullPath_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool URI::isCgi() const noexcept
|
bool URI::isCgi() const noexcept
|
||||||
|
|||||||
@ -49,6 +49,7 @@ class URI
|
|||||||
std::string query_;
|
std::string query_;
|
||||||
std::string fragment_;
|
std::string fragment_;
|
||||||
std::string authority_;
|
std::string authority_;
|
||||||
|
bool valid_ = true;
|
||||||
|
|
||||||
static const AConfig *matchConfig(const std::string &uri, const ServerConfig &serverConfig);
|
static const AConfig *matchConfig(const std::string &uri, const ServerConfig &serverConfig);
|
||||||
};
|
};
|
||||||
@ -94,7 +94,6 @@ void HttpRequest::parseBuffer()
|
|||||||
return; // Request is complete
|
return; // Request is complete
|
||||||
case State::ParseError:
|
case State::ParseError:
|
||||||
Log::warning("Parse error occurred, stopping further processing");
|
Log::warning("Parse error occurred, stopping further processing");
|
||||||
client_->setStatusCode(Http::StatusCode::BAD_REQUEST);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -168,7 +168,7 @@ void Server::handleRequest(struct epoll_event *event) const
|
|||||||
client.getSocket(client_fd).callback();
|
client.getSocket(client_fd).callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::responseReady(int client_fd) const
|
void Server::writable(int client_fd) const
|
||||||
{
|
{
|
||||||
Log::trace(LOCATION);
|
Log::trace(LOCATION);
|
||||||
Log::debug("Response ready for client fd: " + std::to_string(client_fd));
|
Log::debug("Response ready for client fd: " + std::to_string(client_fd));
|
||||||
|
|||||||
@ -36,7 +36,7 @@ class Server
|
|||||||
void add(const ASocket &socket, uint32_t events, Client *client = nullptr);
|
void add(const ASocket &socket, uint32_t events, Client *client = nullptr);
|
||||||
void remove(const ASocket &socket);
|
void remove(const ASocket &socket);
|
||||||
void disconnect(const Client &client);
|
void disconnect(const Client &client);
|
||||||
void responseReady(int client_fd) const;
|
void writable(int client_fd) const;
|
||||||
|
|
||||||
ServerSocket &getListener(int fd) const;
|
ServerSocket &getListener(int fd) const;
|
||||||
Client &getClient(int fd) const;
|
Client &getClient(int fd) const;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user