Set content length for PUT in JDK transport (#1798)
That got lost once we moved off from ugly temp file hack.
---------
Co-authored-by: Konrad Windszus <konrad@windszus.net>
diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
index 0270cf3..d1aab00 100644
--- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
+++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
@@ -857,14 +857,18 @@
@Test
protected void testPut_FromMemory() throws Exception {
RecordingTransportListener listener = new RecordingTransportListener();
+ String payload = "upload";
PutTask task =
- new PutTask(URI.create("repo/file.txt")).setListener(listener).setDataString("upload");
+ new PutTask(URI.create("repo/file.txt")).setListener(listener).setDataString(payload);
transporter.put(task);
assertEquals(0L, listener.getDataOffset());
assertEquals(6L, listener.getDataLength());
assertEquals(1, listener.getStartedCount());
assertTrue(listener.getProgressedCount() > 0, "Count: " + listener.getProgressedCount());
assertEquals("upload", TestFileUtils.readString(new File(repoDir, "file.txt")));
+ assertEquals(
+ String.valueOf(payload.getBytes(StandardCharsets.UTF_8).length),
+ httpServer.getLogEntries().get(0).getRequestHeaders().get("Content-Length"));
}
@Test
@@ -879,6 +883,9 @@
assertEquals(1, listener.getStartedCount());
assertTrue(listener.getProgressedCount() > 0, "Count: " + listener.getProgressedCount());
assertEquals("upload", TestFileUtils.readString(new File(repoDir, "file.txt")));
+ assertEquals(
+ String.valueOf(file.length()),
+ httpServer.getLogEntries().get(0).getRequestHeaders().get("Content-Length"));
}
@Test
diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
index eb0d60f..4999989 100644
--- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
+++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
@@ -397,14 +397,21 @@
}
headers.forEach(request::setHeader);
- request.PUT(HttpRequest.BodyPublishers.ofInputStream(() -> {
- try {
- return new TransportListenerNotifyingInputStream(
- task.newInputStream(), task.getListener(), task.getDataLength());
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- }));
+ if (task.getDataLength() == 0L) {
+ request.PUT(HttpRequest.BodyPublishers.noBody());
+ } else {
+ request.PUT(HttpRequest.BodyPublishers.fromPublisher(
+ HttpRequest.BodyPublishers.ofInputStream(() -> {
+ try {
+ return new TransportListenerNotifyingInputStream(
+ task.newInputStream(), task.getListener(), task.getDataLength());
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }),
+ // this adds a content-length request header
+ task.getDataLength()));
+ }
prepare(request);
try {
HttpResponse<Void> response = send(request.build(), HttpResponse.BodyHandlers.discarding());