The pipeline defined in the bulk update item here is ignored:

```
POST /_bulk
{"update":{"_id":"1","_index":"pipeline-test","pipeline":"lowercase-pipeline"}}
{"upsert":{"myField":"UPPER"},"script":{"source":"ctx._source.myField = 'CHANGED'","lang":"painless"}}
```

Only if the pipeline is defined as query string argument, then the pipeline is picked up and used to process the upset:

```
POST /_bulk?pipeline=lowercase-pipeline
{"update":{"_id":"1","_index":"pipeline-test"}}
{"upsert":{"myField":"UPPER"},"script":{"source":"ctx._source.myField = 'CHANGED'","lang":"painless"}}
```

The Bulk API should also use the pipeline defined in the bulk update item.
server/src/main/java/org/elasticsearch/action/bulk/BulkRequestParser.java
}
        }
    }
    private static void checkBulkActionIsProperlyClosed(XContentParser parser) throws IOException {
        XContentParser.Token token;
        try {
            token = parser.nextToken();
        } catch (XContentEOFException ignore) {
            deprecationLogger.compatibleCritical(
                STRICT_ACTION_PARSING_WARNING_KEY,
                "A bulk action wasn't closed properly with the closing brace. Malformed objects are currently accepted but will be "
                    + "rejected in a future version."
            );
            return;
        }
        if (token != XContentParser.Token.END_OBJECT) {
            deprecationLogger.compatibleCritical(
                STRICT_ACTION_PARSING_WARNING_KEY,
                "A bulk action object contained multiple keys. Additional keys are currently ignored but will be rejected in a "
                    + "future version."
            );
            return;
        }
        if (parser.nextToken() != null) {
            deprecationLogger.compatibleCritical(
                STRICT_ACTION_PARSING_WARNING_KEY,
                "A bulk action contained trailing data after the closing brace. This is currently ignored but will be rejected in a "
                    + "future version."
            );
        }