|  | 
| 7 | 7 | 
 | 
| 8 | 8 | package org.elasticsearch.xpack.security.audit; | 
| 9 | 9 | 
 | 
|  | 10 | +import org.apache.http.entity.ContentType; | 
|  | 11 | +import org.apache.http.entity.StringEntity; | 
| 10 | 12 | import org.elasticsearch.client.Request; | 
| 11 | 13 | import org.elasticsearch.client.Response; | 
| 12 | 14 | import org.elasticsearch.common.bytes.BytesReference; | 
|  | 
| 27 | 29 | import org.junit.ClassRule; | 
| 28 | 30 | 
 | 
| 29 | 31 | import java.io.IOException; | 
|  | 32 | +import java.nio.charset.StandardCharsets; | 
| 30 | 33 | import java.time.Instant; | 
| 31 | 34 | import java.time.ZonedDateTime; | 
| 32 | 35 | import java.time.format.DateTimeFormatter; | 
|  | 
| 37 | 40 | import java.util.concurrent.TimeUnit; | 
| 38 | 41 | import java.util.function.Predicate; | 
| 39 | 42 | 
 | 
|  | 43 | +import static org.hamcrest.Matchers.allOf; | 
| 40 | 44 | import static org.hamcrest.Matchers.containsString; | 
| 41 | 45 | import static org.hamcrest.Matchers.hasEntry; | 
| 42 | 46 | import static org.hamcrest.Matchers.hasKey; | 
| @@ -103,6 +107,25 @@ public void testFilteringOfRequestBodies() throws Exception { | 
| 103 | 107 |         }); | 
| 104 | 108 |     } | 
| 105 | 109 | 
 | 
|  | 110 | +    public void testAuditAuthenticationSuccessForStreamingRequest() throws Exception { | 
|  | 111 | +        final Request request = new Request("POST", "/testindex/_bulk"); | 
|  | 112 | +        request.setEntity(new StringEntity(""" | 
|  | 113 | +            {"index":{}} | 
|  | 114 | +            {} | 
|  | 115 | +            """, ContentType.create("application/x-ndjson", StandardCharsets.UTF_8))); | 
|  | 116 | +        executeAndVerifyAudit( | 
|  | 117 | +            request, | 
|  | 118 | +            AuditLevel.AUTHENTICATION_SUCCESS, | 
|  | 119 | +            event -> assertThat( | 
|  | 120 | +                event, | 
|  | 121 | +                allOf( | 
|  | 122 | +                    hasEntry(LoggingAuditTrail.AUTHENTICATION_TYPE_FIELD_NAME, "REALM"), | 
|  | 123 | +                    hasEntry(LoggingAuditTrail.REQUEST_BODY_FIELD_NAME, "Request body had not been received at the time of the audit event") | 
|  | 124 | +                ) | 
|  | 125 | +            ) | 
|  | 126 | +        ); | 
|  | 127 | +    } | 
|  | 128 | + | 
| 106 | 129 |     private void executeAndVerifyAudit(Request request, AuditLevel eventType, CheckedConsumer<Map<String, Object>, Exception> assertions) | 
| 107 | 130 |         throws Exception { | 
| 108 | 131 |         Instant start = Instant.now(); | 
|  | 
0 commit comments