From bf1c71f176587d9f2ebf9983bb70095ff0cd5a03 Mon Sep 17 00:00:00 2001 From: Adrian Victor Date: Sat, 28 Mar 2026 11:31:41 -0300 Subject: [PATCH] Change LoginHandler response to always use JSON, add token-grabber.js example for interacting with the login API. --- docs/examples/token-grabber.js | 23 +++++++++++++++++++ .../livingroom/http/HttpResponse.java | 11 ++++++++- .../http/handlers/LoginHandler.java | 21 ++++++++++------- 3 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 docs/examples/token-grabber.js diff --git a/docs/examples/token-grabber.js b/docs/examples/token-grabber.js new file mode 100644 index 0000000..5896381 --- /dev/null +++ b/docs/examples/token-grabber.js @@ -0,0 +1,23 @@ +import readline from 'readline/promises'; +import { stdin as input, stdout as output } from 'process'; + +const rl = readline.createInterface({ input, output }); + +const username = await rl.question('Please enter your username: '); +const password = await rl.question('Please enter your password: '); + +rl.close(); + +const loginResponse = await fetch('http://localhost:8080/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }) +}); + +const data = await loginResponse.json(); +if (data.success != 'true') { + console.log(`Login not successful: ${data.message}`); + process.exit(1); +} +const sessionID = data.sessionId; +console.log(`Your token is: ${sessionID}`); \ No newline at end of file diff --git a/src/main/java/org/adrianvictor/livingroom/http/HttpResponse.java b/src/main/java/org/adrianvictor/livingroom/http/HttpResponse.java index b2c7206..27f328f 100644 --- a/src/main/java/org/adrianvictor/livingroom/http/HttpResponse.java +++ b/src/main/java/org/adrianvictor/livingroom/http/HttpResponse.java @@ -1,5 +1,6 @@ package org.adrianvictor.livingroom.http; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -18,12 +19,20 @@ public record HttpResponse( public static HttpResponse text(int status, String text) { return new HttpResponse( - 400, + status, text.getBytes(), Map.of() ); } + public static HttpResponse json(int status, String text) { + return new HttpResponse( + status, + text.getBytes(StandardCharsets.UTF_8), + Map.of("Content-Type", "application/json") + ); + } + public static HttpResponse ok(byte[] body, String contentType) { return ok(body, contentType, new HashMap<>()); } diff --git a/src/main/java/org/adrianvictor/livingroom/http/handlers/LoginHandler.java b/src/main/java/org/adrianvictor/livingroom/http/handlers/LoginHandler.java index 0adf0e5..621c0ca 100644 --- a/src/main/java/org/adrianvictor/livingroom/http/handlers/LoginHandler.java +++ b/src/main/java/org/adrianvictor/livingroom/http/handlers/LoginHandler.java @@ -26,7 +26,8 @@ public class LoginHandler implements Handler { Session session = AuthenticationHelper.getAuthenticatedSession(exchange); if (session != null) { - return HttpResponse.text(400, "You're already logged in."); + String jsonResponse = "{\"success\": false, \"message\": \"You're already logged in.\"}"; + return HttpResponse.json(400, jsonResponse); } try { @@ -39,7 +40,8 @@ public class LoginHandler implements Handler { String password = (String) json.get("password"); if (password == null || username == null) { - return HttpResponse.text(400, "You must provide an username and password."); + String jsonResponse = "{\"success\": false, \"message\": \"Invalid username or password.\"}"; + return HttpResponse.json(400, jsonResponse); } try { @@ -50,20 +52,23 @@ public class LoginHandler implements Handler { "SESSIONID=" + s.getSessionId() + "; Path=/; HttpOnly; SameSite=Strict"); String jsonResponse = "{\"success\": true, \"sessionId\": \"" + s.getSessionId() + "\"}"; - return HttpResponse.ok(jsonResponse.getBytes(StandardCharsets.UTF_8), "application/json"); + return HttpResponse.json(200, jsonResponse); } else { - return HttpResponse.text(401, "Invalid username or password"); + String jsonResponse = "{\"success\": false, \"message\": \"Invalid username or password.\"}"; + return HttpResponse.json(401, jsonResponse); } } catch (Exception e) { Logger.error("User lookup error: " + e.getMessage()); - return HttpResponse.text(401, "Invalid username or password"); + String jsonResponse = "{\"success\": false, \"message\": \"Invalid username or password.\"}"; + return HttpResponse.json(401, jsonResponse); } } catch (IOException e) { Logger.error("Error reading request body: " + e.getMessage()); - return HttpResponse.text(400, "Invalid request"); + String jsonResponse = "{\"success\": false, \"message\": \"Invalid request.\"}"; + return HttpResponse.json(400, jsonResponse); } catch (ParseException e) { - Logger.error("Error parsing JSON: " + e.getMessage()); - return HttpResponse.text(400, "Invalid JSON format"); + String jsonResponse = "{\"success\": false, \"message\": \"Invalid body JSON.\"}"; + return HttpResponse.json(400, jsonResponse); } } } \ No newline at end of file