follow up for anyone looking at similiar problems:
it seems that open liberty sends headers as soon as a stream is starting to
send; thats more narrow than e.g. glassfish, payara etc. do
solving this is quite easy as soon as you know where to look at (since we get
no real place shown where this happens, this is the most difficult part to
find):
if (RequestCycle.get() != null && RequestCycle.get().getResponse() instanceof
WebResponse) {
//here we force wicket to finish the response and send the headers before we
send the stream by ourself
((WebResponse) RequestCycle.get().getResponse()).flush();
}
Example can be found here
https://github.com/kbachl/brix-cms/commit/5254857cd8f877ec1aef571c903d742cad1c60a7#diff-17d3411cdef14a363daf2c6bef61939e6b77edeff559b62925d8e2a09963bbab
targeting this file
https://github.com/kbachl/brix-cms/blob/5254857cd8f877ec1aef571c903d742cad1c60a7/brix-core/src/main/java/org/brixcms/plugin/site/resource/Streamer.java
It might be unusual in most apps to manually fiddle with streams anyway, but I
still hope someone might be saved some time
----- Ursprüngliche Mail -----
> Von: "Korbinian Bachl" <[email protected]>
> An: "dev" <[email protected]>
> Gesendet: Dienstag, 25. November 2025 16:26:14
> Betreff: wicket 10 and open liberty -> wicket trying to write to headers too
> late?
> Hi,
>
> I currently look a bit at open liberty as server and so far its really nice.
> One
> thing however that is problem so far is that wicket tries to write to headers
> at a time the response seems to be processed already?
>
> e.g. log:
>
> [INFO] [INFO ]
> AddExpiresHeaderResponse.setHeader(Cross-Origin-Embedder-Policy-Report-Only,
> require-corp)
> [INFO] [WARNING ] SRVE8094W: WARNING: Cannot set header. Response already
> committed. Stack trace of errant attempt to set header:
> [INFO] at
> com.ibm.ws.webcontainer.srt.SRTServletResponse.setHeader(SRTServletResponse.java:1845)
> [INFO] at [internal classes].(Unknown Source)
> [INFO] at
> de.int.debug.AddExpiresHeaderResponse.setHeader(AddExpiresHeaderResponse.java:86)
> [INFO] at
> org.apache.wicket.protocol.http.servlet.ServletWebResponse.setHeader(ServletWebResponse.java:100)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse.lambda$setHeader$5(BufferedWebResponse.java:204)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse$Action.invoke(BufferedWebResponse.java:136)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:347)
> [INFO] at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.stopBuffering(HeaderBufferingWebResponse.java:59)
> [INFO] at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.flush(HeaderBufferingWebResponse.java:96)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:280)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:208)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:307)
> "
> I used a custom AddExpiresHeaderResponse.setHeader for debugging and see where
> this comes from. It seems that the "Cross-Origin-Embedder-Policy-Report-Only"
> coming in too late in the processing?
>
> Also setDate Header comes to late, too:
>
> [INFO] [WARNING ] SRVE8094W: WARNING: Cannot set header. Response already
> committed. Stack trace of errant attempt to set header:
> [INFO] at
> com.ibm.ws.webcontainer.srt.SRTServletResponse.setDateHeader(SRTServletResponse.java:1774)
> [INFO] at [internal classes].(Unknown Source)
> [INFO] at
> org.apache.wicket.protocol.http.servlet.ServletWebResponse.setDateHeader(ServletWebResponse.java:88)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse.lambda$setDateHeader$4(BufferedWebResponse.java:192)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse$Action.invoke(BufferedWebResponse.java:136)
> [INFO] at
> org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:347)
> [INFO] at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.stopBuffering(HeaderBufferingWebResponse.java:59)
> [INFO] at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.flush(HeaderBufferingWebResponse.java:96)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:280)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:208)
> [INFO] at
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:307)
>
>
> Any idea how to solve this?