+String[] parts = path.split("/");if (parts.length < 4) {sendText(exchange, 404, "Not Found");return;}String idxStr = parts[3];int index;try {index = Integer.parseInt(idxStr);} catch (NumberFormatException e) {sendText(exchange, 400, "Invalid index");return;}String method = exchange.getRequestMethod().toUpperCase();boolean isCompletePath = parts.length >= 5 && "complete".equalsIgnoreCase(parts[4]);try {if ("DELETE".equals(method) && parts.length==4){boolean ok = taskManager.deleteTask(index);if (ok) {sendJson(exchange, 200, "{\"status\":\"deleted\"}");} else {sendJson(exchange, 400, "{\"error\":\"Delete failed\"}");}} else if ("PUT".equals(method) && isCompletePath){boolean ok = taskManager.completeTask(index);if (ok) {sendJson(exchange, 200, "{\"status\":\"completed\"}");} else {sendJson(exchange, 400, "{\"error\":\"Complete failed\"}");}} else {sendText(exchange, 405, "Method Not Allowed");}} catch (Exception e){sendJson(exchange, 500, "{\"error\":\""+escape(e.getMessage())+"\"}");}}private List<Task> getTasksSnapshot() {try {java.lang.reflect.Field f = TaskManager.class.getDeclaredField("tasks");f.setAccessible(true);@SuppressWarnings("unchecked")List<Task> list = (List<Task>) f.get(taskManager);return List.copyOf(list);} catch (Exception e) {return List.of();}}private String toJson(List<Task> tasks) {String items = tasks.stream().map(t -> "{" +"\"title\":\"" + escape(t.getTitle()) + "\"," +"\"category\":\"" + escape(t.getCategory()) + "\"," +"\"completed\":" + (t.isCompleted() ? "true" : "false") +"}").collect(Collectors.joining(","));return "[" + items + "]";}private String parseTitle(String body) {try {int i = body.indexOf("\"title\"");if (i < 0) return null;int c = body.indexOf(':', i);if (c < 0) return null;int q1 = body.indexOf('"', c+1);if (q1 < 0) return null;int q2 = body.indexOf('"', q1+1);if (q2 < 0) return null;return body.substring(q1+1, q2);} catch (Exception e) {return null;}}private void sendHtml(HttpExchange ex, int code, String html) throws IOException {byte[] b = html.getBytes(StandardCharsets.UTF_8);ex.getResponseHeaders().set("Content-Type", "text/html; charset=utf-8");ex.sendResponseHeaders(code, b.length);try (OutputStream os = ex.getResponseBody()) { os.write(b); }}private void sendJson(HttpExchange ex, int code, String json) throws IOException {byte[] b = json.getBytes(StandardCharsets.UTF_8);ex.getResponseHeaders().set("Content-Type", "application/json; charset=utf-8");ex.sendResponseHeaders(code, b.length);try (OutputStream os = ex.getResponseBody()) { os.write(b); }}private void sendText(HttpExchange ex, int code, String text) throws IOException {byte[] b = text.getBytes(StandardCharsets.UTF_8);ex.getResponseHeaders().set("Content-Type", "text/plain; charset=utf-8");ex.sendResponseHeaders(code, b.length);try (OutputStream os = ex.getResponseBody()) { os.write(b); }}private String escape(String s) { return s == null ? "" : s.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n"); }}
0 commit comments