-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[톰캣 구현하기 - 3, 4단계] 가비(이준희) 미션 제출합니다. #434
Changes from all commits
f6acd4d
1fa9495
1f7285a
33308d6
d21d069
907c901
4733ff1
e134f63
b737ed4
de3b002
3029d5d
e64b136
4f7f9a1
5d9b50a
6ae8dca
0deab4a
36467c8
554c236
c1c4bf6
30afd5a
876e87c
8b1cb1e
3231f0d
9893af2
0b90504
8c06beb
71b256b
49af628
d33e781
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.catalina.controller.Controller; | ||
import org.apache.coyote.http11.request.HttpRequest; | ||
import org.apache.coyote.http11.response.HttpResponse; | ||
|
||
public class FrontController extends AbstractController { | ||
|
||
private static final Map<String, Controller> URIS = new HashMap<>(); | ||
|
||
static { | ||
URIS.put("/", new HomeController()); | ||
URIS.put("/login", new LoginController()); | ||
URIS.put("/register", new RegisterController()); | ||
URIS.put("/index", new IndexController()); | ||
} | ||
|
||
@Override | ||
public void service(HttpRequest request, HttpResponse response) { | ||
String uri = request.getResourceUri(); | ||
Controller controller = URIS.getOrDefault(uri, new ResourceController()); | ||
controller.service(request, response); | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.coyote.http11.request.HttpRequest; | ||
import org.apache.coyote.http11.response.HttpResponse; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.ResponseBody; | ||
import org.apache.coyote.http11.response.StatusLine; | ||
|
||
import static org.apache.coyote.http11.request.ContentType.HTML; | ||
|
||
|
||
public class HomeController extends AbstractController { | ||
private static final String DEFAULT_MESSAGE = "Hello world!"; | ||
|
||
@Override | ||
protected void doGet(HttpRequest request, HttpResponse response) { | ||
StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); | ||
response | ||
.statusLine(statusLine) | ||
.contentType(HTML.getValue()) | ||
.contentLength(DEFAULT_MESSAGE.getBytes().length) | ||
.responseBody(new ResponseBody(DEFAULT_MESSAGE)); | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.coyote.http11.request.HttpRequest; | ||
import org.apache.coyote.http11.response.HttpResponse; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.ResponseBody; | ||
import org.apache.coyote.http11.response.StatusLine; | ||
import org.apache.coyote.http11.util.FileReader; | ||
|
||
import static org.apache.coyote.http11.request.ContentType.HTML; | ||
|
||
public class IndexController extends AbstractController { | ||
private static final String RESOURCE = "/index.html"; | ||
|
||
@Override | ||
protected void doGet(HttpRequest request, HttpResponse response) { | ||
ResponseBody responseBody = new ResponseBody(FileReader.read(RESOURCE)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FileReader 좋은데요~!? 👍 |
||
StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); | ||
response | ||
.statusLine(statusLine) | ||
.contentType(HTML.getValue()) | ||
.contentLength(responseBody.getValue().getBytes().length) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아이고 이부분을 놓쳤었네요! |
||
.responseBody(responseBody); | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.util.Optional; | ||
import java.util.UUID; | ||
|
||
import nextstep.jwp.db.InMemoryUserRepository; | ||
import nextstep.jwp.model.User; | ||
import org.apache.coyote.http11.common.HttpCookie; | ||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.coyote.http11.request.HttpRequest; | ||
import org.apache.coyote.http11.request.RequestBody; | ||
import org.apache.coyote.http11.response.HttpResponse; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.ResponseBody; | ||
import org.apache.coyote.http11.response.StatusLine; | ||
import org.apache.catalina.Session; | ||
import org.apache.catalina.SessionManager; | ||
import org.apache.coyote.http11.util.FileReader; | ||
|
||
import static org.apache.coyote.http11.request.ContentType.HTML; | ||
|
||
public class LoginController extends AbstractController { | ||
|
||
private static final String URI = "/login.html"; | ||
private static final String UNAUTHORIZED = "/401.html"; | ||
private static final String REDIRECT_HOME_URI = "/index.html"; | ||
|
||
public static final SessionManager SESSION_MANAGER = new SessionManager(); | ||
|
||
@Override | ||
protected void doGet(HttpRequest request, HttpResponse response) { | ||
if (hasCookie(request)) { | ||
redirectHome(request, response); | ||
return; | ||
} | ||
showLoginPage(request, response); | ||
} | ||
|
||
private boolean hasCookie(HttpRequest httpRequest) { | ||
HttpCookie cookie = HttpCookie.from(httpRequest.getHeaderValue("Cookie")); | ||
return SESSION_MANAGER.findSession(cookie.getValue("JSESSIONID")) != null; | ||
} | ||
|
||
private void redirectHome(HttpRequest request, HttpResponse response) { | ||
StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.FOUND); | ||
ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); | ||
response | ||
.statusLine(statusLine) | ||
.contentType(HTML.getValue()) | ||
.contentLength(responseBody.getValue().getBytes().length) | ||
.redirect(REDIRECT_HOME_URI) | ||
.responseBody(responseBody); | ||
} | ||
|
||
private void showLoginPage(HttpRequest request, HttpResponse response) { | ||
ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); | ||
StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); | ||
response | ||
.statusLine(statusLine) | ||
.contentType(HTML.getValue()) | ||
.contentLength(responseBody.getValue().length()) | ||
.responseBody(responseBody); | ||
} | ||
|
||
@Override | ||
protected void doPost(HttpRequest httpRequest, HttpResponse httpResponse) { | ||
Optional<User> optionalUser = findUser(httpRequest); | ||
if (optionalUser.isEmpty()) { | ||
redirectUnauthorized(httpRequest, httpResponse); | ||
return; | ||
} | ||
|
||
successLogin(httpRequest, httpResponse); | ||
} | ||
|
||
private Optional<User> findUser(HttpRequest request) { | ||
RequestBody requestBody = request.getRequestBody(); | ||
String account = requestBody.getValueOf("account"); | ||
String password = requestBody.getValueOf("password"); | ||
return InMemoryUserRepository.findByAccount(account) | ||
.stream() | ||
.filter(it -> it.checkPassword(password)) | ||
.findFirst(); | ||
} | ||
|
||
private void redirectUnauthorized(HttpRequest httpRequest, HttpResponse httpResponse) { | ||
ResponseBody responseBody = new ResponseBody(FileReader.read(UNAUTHORIZED)); | ||
httpResponse | ||
.statusLine(new StatusLine(httpRequest.getProtocolVersion(), HttpStatus.UNAUTHORIZED)) | ||
.contentType(HTML.getValue()) | ||
.contentLength(responseBody.getValue().getBytes().length) | ||
.redirect(UNAUTHORIZED) | ||
.responseBody(responseBody); | ||
} | ||
|
||
private void successLogin(HttpRequest httpRequest, HttpResponse httpResponse) { | ||
String sessionId = addSession(); | ||
|
||
ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); | ||
httpResponse | ||
.statusLine(new StatusLine(httpRequest.getProtocolVersion(), HttpStatus.FOUND)) | ||
.contentType(HTML.getValue()) | ||
.contentLength(responseBody.getValue().getBytes().length) | ||
.setCookie(HttpCookie.jSessionId(sessionId)) | ||
.redirect(REDIRECT_HOME_URI) | ||
.responseBody(responseBody); | ||
} | ||
|
||
private String addSession() { | ||
String uuid = UUID.randomUUID().toString(); | ||
SESSION_MANAGER.add(new Session(uuid)); | ||
return uuid; | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
초기화 블럭 👍