geonetwork / core-geonetwork

GeoNetwork is a catalog application to manage spatially referenced resources. It provides powerful metadata editing and search functions as well as an interactive web map viewer. It is currently used in numerous Spatial Data Infrastructure initiatives across the world.
http://geonetwork-opensource.org/
GNU General Public License v2.0
426 stars 489 forks source link

Editor: can't remove uploaded resource #1943

Open fgravin opened 7 years ago

fgravin commented 7 years ago

In the editor online resources section, when you have uploaded a file, you can see it in the online resource modal, but when you click on the red cross to remove it, it doesn't work.

image

fxprunayre commented 7 years ago

It works fine here. Any error in logs or in API call response ?

josegar74 commented 7 years ago

Tested in 3.2.x and seem fine, but with develop branch in a server using https, I get an error. This is the request send:

DELETE https://SERVER/geonetwork/proxy?url=https%3A%2F%2SERVER%3A8080%2Fgeonetwork%2Fsrv%2Fapi%2Frecords%2Ff40faedf-b6cd-44e7-bb6c-d07c35f7537e%2Fattachments%2Fpresentationpps.pps

That causes this error:

<html><head><title>Apache Tomcat/7.0.52 (Ubuntu) - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - Unrecognized SSL message, plaintext connection?</h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u>Unrecognized SSL message, plaintext connection?</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710)
    sun.security.ssl.InputRecord.read(InputRecord.java:527)
    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)

Not sure why using port 8080 if the server seem setup properly:

screen shot 2017-05-30 at 14 32 25

Also not sure why using the proxy for this, in 3.2.x it's not using it.

Not sure if the same issue as reported, but seem not working well.

josegar74 commented 7 years ago

The problem seem indeed with https, the resource is stored using the port value, not the secure port due to SettingManager.getBaseURL that seem only using Port and notSecure Port if the protocol is set to https.

That causes the CORSInterceptor in AngujarJs code to use the proxy if the initial request fails.

Wrong code:

https://github.com/geonetwork/core-geonetwork/blob/develop/core/src/main/java/org/fao/geonet/kernel/setting/SettingManager.java#L383-L390

So any code using SettingManager.getBaseURL if the protocol is https will cause problems.

I have never understood the requirement to configure Port and Secure Port, is there any reason to have 2 ports? Should not be better to use 1 field and configure it according to the protocol selected? I think originally was like that, but probably I'm missing something for this change @fxprunayre ?

josegar74 commented 7 years ago

@fgravin please check https://github.com/geonetwork/core-geonetwork/pull/2014, we could reproduce a similar issue without https stuff described in previous comment. I guess is the same you get. The pull request should fix it.

fleimgruber commented 8 months ago

@josegar74 I am seeing the same error on 4.4.1 on a deployment using HTTPS and GeoNetwork behind a Traefik reverse proxy - both dockerized and configured like https://github.com/geonetwork/docker-geonetwork/blob/main/4.4.1/docker-compose.yml. The prompt says

Do you really want to remove the overview 'http://service.tld/geonetwork/srv/api/records/725acb1e-0da6-4ea3-9d63-405d68dbfc81/attachments/Netzbetreiber.jpeg'?

Where the "http" seems wrong as you mentioned in previous comments.

fleimgruber commented 8 months ago

I tried to delete it manually via your approach in https://github.com/geonetwork/core-geonetwork/issues/1943#issuecomment-304864215, i.e.

curl -v -X "DELETE" localhost:8080/geonetwork/srv/api/records/725acb1e-0da6-4ea3-9d63-405d68dbfc81/attachments/Netzbetreiber.jpeg

but I get an HTTP 403, as there was not authentication. I found documentation for the endpoint /records/{metadataUuid}/attachments/{resourceId} in the OpenAPI specs, but no information on authentication. In the API doc examples I found curl used with an $AUTH, but that is not defined in the docs.

Edit: I got it to work using the relevant parts with $TOKEN. The attachment seems to be removed, but the metadata of the record still refers to it. The https vs. http issue from Web Editor remains.

josegar74 commented 8 months ago

@fleimgruber try the following script, based on https://docs.geonetwork-opensource.org/4.2/api/the-geonetwork-api/#using-the-api-to-apply-an-xsl-process

CATALOG=http://localhost:8080/geonetwork
CATALOGUSER=admin
CATALOGPASS=admin

rm -f /tmp/cookie;
curl -s -c /tmp/cookie -o /dev/null \
  -X GET \
  -H "Accept: application/json" \
  "$CATALOG/srv/api/me";
TOKEN=`grep XSRF-TOKEN /tmp/cookie | cut -f 7`;

curl -v -X DELETE "$CATALOG/srv/api/records/725acb1e-0da6-4ea3-9d63-405d68dbfc81/attachments/Netzbetreiber.jpeg" \
    -H "X-XSRF-TOKEN: $TOKEN" -c /tmp/cookie -b /tmp/cookie --user $CATALOGUSER:$CATALOGPASS 
fleimgruber commented 8 months ago

@josegar74 thanks for checking back! It seems you missed or misunderstood the "Edit" in my comment: I managed to delete the file via curl, in the way you outlined (what I called "the relevant parts with $TOKEN").

So remaining issue is the https vs. http from Web Editor, i.e. OP and your analysis from 2017.

josegar74 commented 8 months ago

@fleimgruber

So remaining issue is the https vs. http from Web Editor,

I have test in GN 4 using https protocol in the Admin console > Settings > Server configuration and the online resource in the Web editor is added with https and can be removed propertly from the editor.

fleimgruber commented 8 months ago

Thanks for testing! Then I think my issue is that the resource was added with the "http" setting, so it also tries to remove it with that value even though the preferred protocol is already set to "https".

fleimgruber commented 8 months ago

This had to do with our reverse proxy settings and automatic redirects. It works with setting "https" as you suggested and also the Port setting needed to be changed to 443, otherwise GN created URLs such as https://our.tld:80/geonetwork/... which could not be routed correctly (leading to uploaded image resources shown as broken).

In summary, I can confirm this is working with the correct server settings in the web UI so I could at least provide some more manual testing.

Edit: seems I was too fast, Removal of uploaded resource still does not remove it and the resource is still shown in the editor. The prompt says "Do you really want to remove the overview 'https://..." and after clicking on OK nothing happens. I don't see an error in the browser inspector tools.

fleimgruber commented 8 months ago

This is what I see in the server logs, note that this is the Docker deployment mentioned in https://github.com/geonetwork/core-geonetwork/issues/7563#issuecomment-1895748585:

2024-02-08T12:10:07,398 ERROR [geonetwork] - I/O error writing PNG file!
javax.imageio.IIOException: I/O error writing PNG file!
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1293) ~[?:?]
    at javax.imageio.ImageWriter.write(ImageWriter.java:613) ~[?:?]
    at javax.imageio.ImageIO.doWrite(ImageIO.java:1628) ~[?:?]
    at javax.imageio.ImageIO.write(ImageIO.java:1594) ~[?:?]
    at org.fao.geonet.api.records.attachments.AttachmentsApi.getResource(AttachmentsApi.java:274) ~[gn-services-4.4.1-0.jar:?]
    at org.fao.geonet.api.records.attachments.AttachmentsApi$$FastClassBySpringCGLIB$$578b9386.invoke(<generated>) ~[gn-services-4.4.1-0.jar:?]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.fao.geonet.api.records.attachments.AttachmentsApi$$EnhancerBySpringCGLIB$$a81632a2.getResource(<generated>) ~[gn-services-4.4.1-0.jar:?]
    at jdk.internal.reflect.GeneratedMethodAccessor397.invoke(Unknown Source) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at jeeves.config.springutil.JeevesDispatcherServlet.access$001(JeevesDispatcherServlet.java:44) ~[gn-core-4.4.1-0.jar:?]
    at jeeves.config.springutil.JeevesDispatcherServlet$1.doInTransaction(JeevesDispatcherServlet.java:56) ~[gn-core-4.4.1-0.jar:?]
    at jeeves.config.springutil.JeevesDispatcherServlet$1.doInTransaction(JeevesDispatcherServlet.java:52) ~[gn-core-4.4.1-0.jar:?]
    at jeeves.transaction.TransactionManager.runInTransaction(TransactionManager.java:75) ~[gn-core-4.4.1-0.jar:?]
    at jeeves.config.springutil.JeevesDispatcherServlet.doDispatch(JeevesDispatcherServlet.java:49) ~[gn-core-4.4.1-0.jar:?]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) ~[servlet-api-3.1.jar:3.1.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.30.jar:5.3.30]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[servlet-api-3.1.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1459) ~[jetty-servlet-9.4.53.v20231009.jar:9.4.53.v20231009]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[jetty-servlet-9.4.53.v20231009.jar:9.4.53.v20231009]
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656) ~[jetty-servlet-9.4.53.v20231009.jar:9.4.53.v20231009]
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:292) ~[websocket-server-9.4.53.v20231009.jar:9.4.53.v20231009]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.fao.geonet.monitor.webapp.WebappMetricsFilter.doFilter(WebappMetricsFilter.java:121) ~[gn-health-monitor-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.fao.geonet.monitor.webapp.MetricsRegistryInitializerFilter.doFilter(MetricsRegistryInitializerFilter.java:58) ~[gn-health-monitor-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.fao.geonet.web.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:110) ~[gn-core-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) ~[urlrewritefilter-4.0.3.jar:4.0.3]
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) ~[urlrewritefilter-4.0.3.jar:4.0.3]
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) ~[urlrewritefilter-4.0.3.jar:4.0.3]
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) ~[urlrewritefilter-4.0.3.jar:4.0.3]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.fao.geonet.web.CORSResponseFilter.doFilter(CORSResponseFilter.java:133) ~[gn-core-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.geonetwork.http.SessionTimeoutCookieFilter.doFilter(SessionTimeoutCookieFilter.java:90) ~[gn-core-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.fao.geonet.web.GeoNetworkPortalFilter.doFilter(GeoNetworkPortalFilter.java:103) ~[gn-core-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:352) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:117) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:227) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:221) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:168) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at jeeves.config.springutil.PassthroughFilter.doFilter(PassthroughFilter.java:50) ~[gn-core-4.4.1-0.jar:?]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:118) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:117) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:225) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:190) ~[spring-security-web-5.8.7.jar:5.8.7]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.30.jar:5.3.30]
    at jeeves.config.springutil.JeevesDelegatingFilterProxy.doFilter(JeevesDelegatingFilterProxy.java:74) ~[gn-core-4.4.1-0.jar:?]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.30.jar:5.3.30]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.30.jar:5.3.30]
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:201) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600) ~[jetty-security-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) ~[jetty-servlet-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:191) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at java.lang.Thread.run(Thread.java:829) ~[?:?]
Caused by: org.eclipse.jetty.io.EofException
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:280) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:422) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:277) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:381) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:831) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:248) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:229) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:555) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:1014) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:1086) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.channelWrite(HttpOutput.java:285) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.channelWrite(HttpOutput.java:269) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:751) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.flush(OnCommittedResponseWrapper.java:523) ~[spring-security-web-5.8.7.jar:5.8.7]
    at javax.imageio.stream.FileCacheImageOutputStream.flushBefore(FileCacheImageOutputStream.java:258) ~[?:?]
    at com.sun.imageio.plugins.png.IDATOutputStream.finishChunk(PNGImageWriter.java:206) ~[?:?]
    at com.sun.imageio.plugins.png.IDATOutputStream.finish(PNGImageWriter.java:276) ~[?:?]
    at com.sun.imageio.plugins.png.PNGImageWriter.write_IDAT(PNGImageWriter.java:1050) ~[?:?]
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1283) ~[?:?]
    ... 136 more
Caused by: java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcherImpl.writev0(Native Method) ~[?:?]
    at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51) ~[?:?]
    at sun.nio.ch.IOUtil.write(IOUtil.java:182) ~[?:?]
    at sun.nio.ch.IOUtil.write(IOUtil.java:130) ~[?:?]
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:493) ~[?:?]
    at java.nio.channels.SocketChannel.write(SocketChannel.java:507) ~[?:?]
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:274) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:422) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:277) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:381) ~[jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
    at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:831) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:248) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:229) ~[jetty-util-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:555) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:1014) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:1086) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.channelWrite(HttpOutput.java:285) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.channelWrite(HttpOutput.java:269) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:751) ~[jetty-server-9.4.52.v20230823.jar:9.4.52.v20230823]
    at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.flush(OnCommittedResponseWrapper.java:523) ~[spring-security-web-5.8.7.jar:5.8.7]
    at javax.imageio.stream.FileCacheImageOutputStream.flushBefore(FileCacheImageOutputStream.java:258) ~[?:?]
    at com.sun.imageio.plugins.png.IDATOutputStream.finishChunk(PNGImageWriter.java:206) ~[?:?]
    at com.sun.imageio.plugins.png.IDATOutputStream.finish(PNGImageWriter.java:276) ~[?:?]
    at com.sun.imageio.plugins.png.PNGImageWriter.write_IDAT(PNGImageWriter.java:1050) ~[?:?]
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1283) ~[?:?]
    ... 136 more