Ver Fonte

Fix Broken Stream Close in writeRawValue (#60625)

Small oversight in #56078 that only showed up during backporting where a stream copy was turned from a non-closing to a closing one. Enhanced part of a test in this PR to make it show up in master also even though we practically never use this method with stream targets that actually close.
Armin Braun há 5 anos atrás
pai
commit
82f040716d

+ 2 - 2
libs/x-content/src/main/java/org/elasticsearch/common/xcontent/json/JsonXContentGenerator.java

@@ -349,7 +349,7 @@ public class JsonXContentGenerator implements XContentGenerator {
         } else {
             writeStartRaw(name);
             flush();
-            Streams.copy(content, os, false);
+            Streams.copy(content, os);
             writeEndRaw();
         }
     }
@@ -364,7 +364,7 @@ public class JsonXContentGenerator implements XContentGenerator {
                 generator.writeRaw(':');
             }
             flush();
-            Streams.copy(stream, os);
+            Streams.copy(stream, os, false);
             writeEndRaw();
         }
     }

+ 9 - 1
server/src/test/java/org/elasticsearch/common/xcontent/BaseXContentTestCase.java

@@ -75,6 +75,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonMap;
@@ -947,11 +948,18 @@ public abstract class BaseXContentTestCase extends ESTestCase {
             assertNull(parser.nextToken());
         }
 
-        os = new ByteArrayOutputStream();
+        final AtomicBoolean closed = new AtomicBoolean(false);
+        os = new ByteArrayOutputStream() {
+            @Override
+            public void close() {
+                closed.set(true);
+            }
+        };
         try (XContentGenerator generator = xcontentType().xContent().createGenerator(os)) {
             generator.writeStartObject();
             generator.writeFieldName("test");
             generator.writeRawValue(new BytesArray(rawData).streamInput(), source.type());
+            assertFalse("Generator should not have closed the output stream", closed.get());
             generator.writeEndObject();
         }