limit upload

This commit is contained in:
rdavidek 2025-12-28 20:08:05 +01:00
parent 4a00eeb3a4
commit 0cfad09c63

View File

@ -17,6 +17,7 @@ import java.util.stream.Collectors;
public class App { public class App {
private static final Gson GSON = new Gson(); private static final Gson GSON = new Gson();
private static final String DATA_FILE = "stats.json"; private static final String DATA_FILE = "stats.json";
private static final long MAX_UPLOAD_SIZE = 5 * 1024 * 1024; // 5MB
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
int port = 8080; int port = 8080;
@ -68,8 +69,35 @@ public class App {
return; return;
} }
String contentLengthHeader = exchange.getRequestHeaders().getFirst("Content-Length");
if (contentLengthHeader != null) {
try {
long contentLength = Long.parseLong(contentLengthHeader);
if (contentLength > MAX_UPLOAD_SIZE) {
sendError(exchange, 413, "File too large. Maximum size is 5MB.");
return;
}
} catch (NumberFormatException ignored) {
}
}
InputStream is = exchange.getRequestBody(); InputStream is = exchange.getRequestBody();
String body = new String(is.readAllBytes(), StandardCharsets.UTF_8); ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
long totalRead = 0;
while ((bytesRead = is.read(buffer)) != -1) {
totalRead += bytesRead;
if (totalRead > MAX_UPLOAD_SIZE) {
sendError(exchange, 413, "File too large. Maximum size is 5MB.");
return;
}
baos.write(buffer, 0, bytesRead);
}
byte[] bytes = baos.toByteArray();
String body = new String(bytes, StandardCharsets.UTF_8);
try { try {
List<RawGame> rawGames = GSON.fromJson(body, new TypeToken<List<RawGame>>(){}.getType()); List<RawGame> rawGames = GSON.fromJson(body, new TypeToken<List<RawGame>>(){}.getType());
@ -78,15 +106,14 @@ public class App {
Files.writeString(Paths.get(DATA_FILE), GSON.toJson(convertedGames)); Files.writeString(Paths.get(DATA_FILE), GSON.toJson(convertedGames));
String response = "Upload successful"; String response = "Upload successful";
exchange.sendResponseHeaders(200, response.length()); byte[] responseBytes = response.getBytes(StandardCharsets.UTF_8);
exchange.getResponseBody().write(response.getBytes()); exchange.sendResponseHeaders(200, responseBytes.length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(responseBytes);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
String response = "Error processing upload: " + e.getMessage(); sendError(exchange, 400, "Error processing upload: " + e.getMessage());
exchange.sendResponseHeaders(400, response.length());
exchange.getResponseBody().write(response.getBytes());
} finally {
exchange.getResponseBody().close();
} }
} }
@ -139,7 +166,13 @@ public class App {
return result; return result;
} }
} }
private static void sendError(HttpExchange exchange, int statusCode, String message) throws IOException {
byte[] responseBytes = message.getBytes(StandardCharsets.UTF_8);
exchange.sendResponseHeaders(statusCode, responseBytes.length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(responseBytes);
}
}
static class StatsHandler implements HttpHandler { static class StatsHandler implements HttpHandler {
@Override @Override
public void handle(HttpExchange exchange) throws IOException { public void handle(HttpExchange exchange) throws IOException {