httpClient method HEAD Content-Length and stream length disagree

Continuing the discussion from httpClient method HEAD:

So I finally tried method HEAD and got the stacktrace below.

(Note: Since I can’t use method HEAD, nor run Get as background task, nor check if an image is already cached, I cannot precache images for 4K screens, cause one page takes about 80 seconds)

15:58:55.690 ERROR c.e.x.p.i.e.ExceptionRendererImpl - Content-Length and stream length disagree
com.enonic.xp.portal.PortalException: Content-Length and stream length disagree
	at com.enonic.xp.portal.impl.exception.ExceptionMapper.map(ExceptionMapper.java:27) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.PortalServlet.handleError(PortalServlet.java:216) [portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.PortalServlet.doHandle(PortalServlet.java:210) [portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.PortalServlet.service(PortalServlet.java:76) [portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:85) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:79) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:73) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.admin.impl.portal.PortalForwardHandler.forwardToPortal(PortalForwardHandler.java:70) [admin-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.admin.impl.portal.PortalForwardHandler.service(PortalForwardHandler.java:46) [admin-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:85) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:79) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.auth.AuthFilter.doHandle(AuthFilter.java:43) [portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.impl.auth.BasicAuthFilter.doHandle(BasicAuthFilter.java:31) [web-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:34) [web-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:101) ~[core-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:33) [web-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:73) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:43) ~[na:na]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:60) ~[na:na]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:124) ~[na:na]
	at org.apache.felix.http.base.internal.DispatcherServlet.service(DispatcherServlet.java:61) ~[na:na]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [web-jetty-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821) ~[na:na]
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) ~[na:na]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[na:na]
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:437) ~[na:na]
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) ~[na:na]
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158) ~[na:na]
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) ~[na:na]
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) ~[na:na]
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090) ~[na:na]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[na:na]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) ~[na:na]
	at org.eclipse.jetty.server.Server.handle(Server.java:517) ~[na:na]
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) ~[na:na]
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) ~[na:na]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) ~[na:na]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) ~[na:na]
	at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) ~[na:na]
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) ~[na:na]
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) ~[na:na]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) ~[na:na]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) ~[na:na]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_77]
Caused by: com.enonic.xp.resource.ResourceProblemException: Content-Length and stream length disagree
	at com.enonic.xp.resource.ResourceProblemException$Builder.build(ResourceProblemException.java:131) ~[core-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.script.impl.util.ErrorHelper.doHandleException(ErrorHelper.java:54) ~[na:na]
	at com.enonic.xp.script.impl.util.ErrorHelper.handleError(ErrorHelper.java:27) ~[na:na]
	at com.enonic.xp.script.impl.executor.ScriptExecutorImpl.invokeMethod(ScriptExecutorImpl.java:170) ~[na:na]
	at com.enonic.xp.script.impl.value.FunctionScriptValue.call(FunctionScriptValue.java:29) ~[na:na]
	at com.enonic.xp.script.impl.ScriptExportsImpl.executeMethod(ScriptExportsImpl.java:56) ~[na:na]
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.doExecute(ControllerScriptImpl.java:53) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.execute(ControllerScriptImpl.java:32) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.doRender(DescriptorBasedComponentRenderer.java:78) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.render(DescriptorBasedComponentRenderer.java:46) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.render(DescriptorBasedComponentRenderer.java:22) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.instruction.ComponentInstruction.renderComponent(ComponentInstruction.java:103) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.instruction.ComponentInstruction.renderComponent(ComponentInstruction.java:92) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.instruction.ComponentInstruction.evaluate(ComponentInstruction.java:70) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.PostProcessEvaluator.executeInstruction(PostProcessEvaluator.java:105) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.PostProcessEvaluator.processInstructions(PostProcessEvaluator.java:86) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.PostProcessEvaluator.evaluateInstructions(PostProcessEvaluator.java:59) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.postprocess.PostProcessorImpl.processResponseInstructions(PostProcessorImpl.java:69) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.rendering.PageRenderer.render(PageRenderer.java:72) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.rendering.PageRenderer.render(PageRenderer.java:30) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.handler.render.PageHandlerWorker.execute(PageHandlerWorker.java:101) ~[portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.handler.BaseHandler.handle(BaseHandler.java:68) ~[portal-api-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	at com.enonic.xp.portal.impl.PortalServlet.doHandle(PortalServlet.java:206) [portal-impl-6.6.2-SNAPSHOT.jar:6.6.2-SNAPSHOT]
	... 81 common frames omitted
Caused by: java.lang.RuntimeException: Content-Length and stream length disagree
	at com.enonic.xp.lib.http.ResponseMapper.getResponseBodyStream(ResponseMapper.java:108) ~[na:na]
	at com.enonic.xp.lib.http.ResponseMapper.serialize(ResponseMapper.java:48) ~[na:na]
	at com.enonic.xp.script.impl.value.JsObjectConverter.toJs(JsObjectConverter.java:50) ~[na:na]
	at com.enonic.xp.script.impl.value.JsObjectConverter.toJs(JsObjectConverter.java:25) ~[na:na]
	at com.enonic.xp.script.impl.function.ScriptFunctions.toNativeObject(ScriptFunctions.java:74) ~[na:na]
	at jdk.nashorn.internal.scripts.Script$Recompilation$171$2944A$http_client.L:1$request(no.posten.postennorge:/site/lib/xp/http-client.js:76) ~[na:na]
	at jdk.nashorn.internal.scripts.Script$Recompilation$170$2694AJA$banner.L:1$buildResponse$L:77(no.posten.postennorge:/site/layouts/banner/banner.js:80) ~[na:na]
	at jdk.nashorn.internal.objects.NativeArray$9.forEach(NativeArray.java:1606) ~[nashorn.jar:na]
	at jdk.nashorn.internal.runtime.arrays.IteratorAction.apply(IteratorAction.java:110) ~[nashorn.jar:na]
	at jdk.nashorn.internal.objects.NativeArray.forEach(NativeArray.java:1609) ~[nashorn.jar:na]
	at jdk.nashorn.internal.scripts.Script$Recompilation$155$1590AA$banner.L:1$buildResponse(no.posten.postennorge:/site/layouts/banner/banner.js:77) ~[na:na]
	at jdk.nashorn.internal.scripts.Script$Recompilation$153$banner.L:1$get-1(no.posten.postennorge:/site/layouts/banner/banner.js:115) ~[na:na]
	at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:614) ~[nashorn.jar:na]
	at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) ~[nashorn.jar:na]
	at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) ~[nashorn.jar:na]
	at jdk.nashorn.api.scripting.ScriptObjectMirror.call(ScriptObjectMirror.java:117) ~[nashorn.jar:na]
	at com.enonic.xp.script.impl.function.CallFunction.call(CallFunction.java:24) ~[na:na]
	at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:201) ~[nashorn.jar:na]
	at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383) ~[nashorn.jar:na]
	at jdk.nashorn.api.scripting.NashornScriptEngine.invokeMethod(NashornScriptEngine.java:199) ~[nashorn.jar:na]
	at com.enonic.xp.script.impl.executor.ScriptExecutorImpl.invokeMethod(ScriptExecutorImpl.java:166) ~[na:na]
	... 100 common frames omitted
Caused by: java.io.IOException: Content-Length and stream length disagree
	at com.squareup.okhttp.ResponseBody.bytes(ResponseBody.java:62) ~[na:na]
	at com.enonic.xp.lib.http.ResponseMapper.getResponseBodyStream(ResponseMapper.java:104) ~[na:na]
	... 120 common frames omitted

This is a bug in the http-client library. It tries to fetch the body of the response, but that does not apply for a HEAD request.
I have registered an issue to fix it.