@@ -209,10 +209,15 @@ public void testMsearchTerminatedByNewline() throws Exception {
209209 assertEquals (3 , msearchRequest .requests ().size ());
210210 }
211211
212+ private MultiSearchRequest parseMultiSearchRequestFromString (String request , RestApiVersion restApiVersion ) throws IOException {
213+ return parseMultiSearchRequest (createRestRequest (request .getBytes (StandardCharsets .UTF_8 ), restApiVersion ));
214+ }
215+
212216 private MultiSearchRequest parseMultiSearchRequest (String sample ) throws IOException {
213- byte [] data = StreamsUtils .copyToBytesFromClasspath (sample );
214- RestRequest restRequest = new FakeRestRequest .Builder (xContentRegistry ())
215- .withContent (new BytesArray (data ), XContentType .JSON ).build ();
217+ return parseMultiSearchRequest (createRestRequest (sample , null ));
218+ }
219+
220+ private MultiSearchRequest parseMultiSearchRequest (RestRequest restRequest ) throws IOException {
216221
217222 MultiSearchRequest request = new MultiSearchRequest ();
218223 RestMultiSearchAction .parseMultiLineRequest (restRequest , SearchRequest .DEFAULT_INDICES_OPTIONS , true ,
@@ -223,6 +228,26 @@ private MultiSearchRequest parseMultiSearchRequest(String sample) throws IOExcep
223228 return request ;
224229 }
225230
231+ private RestRequest createRestRequest (String sample , RestApiVersion restApiVersion ) throws IOException {
232+ byte [] data = StreamsUtils .copyToBytesFromClasspath (sample );
233+ return createRestRequest (data , restApiVersion );
234+ }
235+
236+ private FakeRestRequest createRestRequest (byte [] data , RestApiVersion restApiVersion ) {
237+ if (restApiVersion != null ) {
238+ final List <String > contentTypeHeader =
239+ Collections .singletonList (compatibleMediaType (XContentType .VND_JSON , RestApiVersion .V_7 ));
240+ return new FakeRestRequest .Builder (xContentRegistry ())
241+ .withHeaders (Map .of ("Content-Type" , contentTypeHeader , "Accept" , contentTypeHeader ))
242+ .withContent (new BytesArray (data ), null )
243+ .build ();
244+ } else {
245+ return new FakeRestRequest .Builder (xContentRegistry ())
246+ .withContent (new BytesArray (data ), XContentType .JSON ).build ();
247+ }
248+ }
249+
250+
226251 @ Override
227252 protected NamedXContentRegistry xContentRegistry () {
228253 return new NamedXContentRegistry (singletonList (new NamedXContentRegistry .Entry (QueryBuilder .class ,
@@ -271,6 +296,48 @@ public void testWritingExpandWildcards() throws IOException {
271296 randomBoolean (), randomBoolean (), randomBoolean ()), "none" );
272297 }
273298
299+ public void testEmptyFirstLine1 () throws Exception {
300+ MultiSearchRequest request = parseMultiSearchRequestFromString (
301+ "\n " +
302+ "\n " +
303+ "{ \" query\" : {\" match_all\" : {}}}\n " +
304+ "{}\n " +
305+ "{ \" query\" : {\" match_all\" : {}}}\n " +
306+ "\n " +
307+ "{ \" query\" : {\" match_all\" : {}}}\n " +
308+ "{}\n " +
309+ "{ \" query\" : {\" match_all\" : {}}}\n " ,
310+ RestApiVersion .V_7 );
311+ assertThat (request .requests ().size (), equalTo (4 ));
312+ for (SearchRequest searchRequest : request .requests ()) {
313+ assertThat (searchRequest .indices ().length , equalTo (0 ));
314+ assertThat (searchRequest .source ().query (), instanceOf (MatchAllQueryBuilder .class ));
315+ }
316+ assertWarnings ("support for empty first line before any action metadata in msearch API is deprecated and will be removed " +
317+ "in the next major version" );
318+ }
319+
320+ public void testEmptyFirstLine2 () throws Exception {
321+ MultiSearchRequest request = parseMultiSearchRequestFromString (
322+ "\n " +
323+ "{}\n " +
324+ "{ \" query\" : {\" match_all\" : {}}}\n " +
325+ "\n " +
326+ "{ \" query\" : {\" match_all\" : {}}}\n " +
327+ "{}\n " +
328+ "{ \" query\" : {\" match_all\" : {}}}\n " +
329+ "\n " +
330+ "{ \" query\" : {\" match_all\" : {}}}\n " ,
331+ RestApiVersion .V_7 );
332+ assertThat (request .requests ().size (), equalTo (4 ));
333+ for (SearchRequest searchRequest : request .requests ()) {
334+ assertThat (searchRequest .indices ().length , equalTo (0 ));
335+ assertThat (searchRequest .source ().query (), instanceOf (MatchAllQueryBuilder .class ));
336+ }
337+ assertWarnings ("support for empty first line before any action metadata in msearch API is deprecated and will be removed " +
338+ "in the next major version" );
339+ }
340+
274341 private void assertExpandWildcardsValue (IndicesOptions options , String expectedValue ) throws IOException {
275342 SearchRequest request = new SearchRequest ();
276343 request .indicesOptions (options );
0 commit comments