diff options
2 files changed, 11 insertions, 4 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java index 8891f108af9..1ce6902abd0 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java @@ -30,11 +30,13 @@ import java.time.Duration; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.logging.Level; import static com.yahoo.vespa.config.server.application.CompressedApplicationInputStream.createFromCompressedStream; import static com.yahoo.vespa.config.server.http.Utils.checkThatTenantExists; import static com.yahoo.vespa.config.server.http.v2.SessionCreateHandler.validateDataAndHeader; +import static java.util.logging.Level.FINE; +import static java.util.logging.Level.INFO; +import static java.util.logging.Level.WARNING; /** * * The implementation of the /application/v2 API. @@ -81,18 +83,22 @@ public class ApplicationApiHandler extends SessionHandler { .map(contentType -> contentType.getMimeType().equalsIgnoreCase(MULTIPART_FORM_DATA)) .orElse(false); if (multipartRequest) { + Map<String, PartItem> parts = Map.of(); try { - Map<String, PartItem> parts = new MultiPartFormParser(request).readParts(); + parts = new MultiPartFormParser(request).readParts(); byte[] params; try (InputStream part = parts.get(MULTIPART_PARAMS).data()) { params = part.readAllBytes(); } - log.log(Level.FINE, "Deploy parameters: [{0}]", new String(params, StandardCharsets.UTF_8)); + log.log(FINE, "Deploy parameters: [{0}]", new String(params, StandardCharsets.UTF_8)); prepareParams = PrepareParams.fromJson(params, tenantName, zookeeperBarrierTimeout); PartItem appPackagePart = parts.get(MULTIPART_APPLICATION_PACKAGE); compressedStream = createFromCompressedStream(appPackagePart.data(), appPackagePart.contentType(), maxApplicationPackageSize); } catch (IOException e) { // Multipart exception happens when controller abandons the request due to other exceptions while deploying. - log.log(e instanceof MultiPartFormParser.MultiPartException ? Level.INFO : Level.WARNING, + log.log(e instanceof MultiPartFormParser.MultiPartException ? INFO : WARNING, "Unable to parse multipart in deploy from tenant '" + tenantName.value() + "': " + Exceptions.toMessageString(e)); + + var message = "Deploy request from '" + tenantName.value() + "' contains invalid data: " + e.getMessage(); + log.log(INFO, message + ", parts: " + parts, e); throw new BadRequestException("Deploy request from '" + tenantName.value() + "' contains invalid data: " + e.getMessage()); } } else { diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java b/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java index 57fbd5eb96c..51264f6b3a9 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java @@ -56,6 +56,7 @@ public class MultiPartFormParser { public String name() { return name; } public InputStream data() { return data; } public String contentType() { return contentType; } + @Override public String toString() { return "PartItem{" + "name='" + name + '\'' + ", contentType='" + contentType + '\'' + '}'; } } public static class MultiPartException extends IOException { |