Hi,
I am using a custom request logger (MyJettyRequestLogger) to log some custom attributes into Jetty request logs. Things were working fine with Jetty 10.x, but broken in Jetty 12.0.15 for me. Here is the simplified implementation (changed a few things according to Jetty 12, earlier I was directly using HttpServletRequest objects in MyJettyRequestLogger class):
import java.util.Set;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.util.Fields;
public class MyJettyRequestLogger extends CustomRequestLog
{
private static final Set<String> auditUrls = Set.of("/system/web/controller/platform/audit/getsearchresult.jsp");
public MyJettyRequestLogger(Writer writer, String logStr)
{
super(writer, logStr);
}
@Override
public void log(Request request, Response response)
{
setCustomAttributesToLog(request, response);
super.log(request, response);
}
private void setCustomAttributesToLog(Request request, Response response)
{
String requestURI = HttpURI.build(request.getHttpURI()).getPath();
String auditParams = setAuditAttributes(request, requestURI);
if (!auditParams.isEmpty())
request.setAttribute("auditParams", auditParams);
}
private String setAuditAttributes(Request request, String requestURI)
{
StringBuilder logBuffer = new StringBuilder();
if ("post".equalsIgnoreCase(request.getMethod()) && auditUrls.contains(requestURI))
{
try
{
Fields params = Request.getParameters(request); // PROBLEM HERE
if (params != null)
{
boolean first = true;
logBuffer.append("[Params:");
for (Fields.Field param : params)
{
if (first)
first = false;
else
logBuffer.append("&");
logBuffer.append(param.getName()).append("=").append(String.join(",", param.getValues()));
}
logBuffer.append("] ");
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
return logBuffer.toString();
}
}
In the above code Request.getParameters(request) is giving me query parameters but not the form field parameters in the POST request. After debugging it into Jetty's code, I came to know that form field parameters are returned as NULL from the following method from org.eclipse.jetty.server.Request
static CompletableFuture<Fields> getParametersAsync(Request request)
{
Fields queryFields = Request.extractQueryParameters(request);
CompletableFuture<Fields> contentFields = FormFields.from(request);
return contentFields.thenApply(formFields -> Fields.combine(queryFields, formFields));
}
Note that I am using EE8 for deploying my war. What am I doing wrong here?
Thanks in advance for any help.
-Umesh.
_______________________________________________