On Tue, Mar 8, 2016 at 10:58 AM, Mark Eggers <its_toas...@yahoo.com.invalid>
wrote:

> Chris,
>
> On 3/8/2016 7:52 AM, Christopher Schultz wrote:
> > Mark,
> >
> > On 3/7/16 5:47 PM, Mark Eggers wrote:
> >> Sean,
> >
> >> I just noticed something else:
> >
> >> On 3/7/2016 2:11 PM, Sean Dawson wrote:
> >>> On Sun, Mar 6, 2016 at 12:48 PM, Sean Dawson
> >>> <seandawson2...@gmail.com> wrote:
> >>>
> >>>>
> >>>> Tomcat 8_32 Windows 7 Java 8_51 RestEasy 3.0.11.Final GWT 2.7.0
> >>>> (Jetty jetty-9.3.5.v20151012)
> >>>>
> >>>> Servlet code makes a RestEasy call to another servlet (same
> >>>> container) - second servlet sets the 'Warning' HTTP header on
> >>>> response.  Would like to access that in first servlet but when
> >>>> running in Tomcat, that header is not included.
> >>>>
> >>>> Code to get header in first servlet:
> >>>>
> >>>> Object headers = ((ClientResponseFailure)
> >>>> e).getResponse().getResponseHeaders().get("Warning");
> >>>>
> >>>> Also tried: getHeaders(), getStringHeaders(), and
> >>>> getHeaderString().
> >>>>
> >>>> When running GWT in superdev mode in IntelliJ (15.0.4) using
> >>>> Jetty, the above returns a List with one item that contains the
> >>>> warning string.  When remote debugging Tomcat, that call
> >>>> returns null.
> >>>>
> >>>> Added this to web app xml, and also tried Tomcat
> >>>> conf/web.xml...
> >>>>
> >>>> <filter> <filter-name>CorsFilter</filter-name>
> >>>> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
> >>>>
> >>>>
> > <init-param>
> >>>> <param-name>cors.exposed.headers</param-name>
> >>>> <param-value>Warning</param-value> </init-param> </filter>
> >>>> <filter-mapping> <filter-name>CorsFilter</filter-name>
> >>>> <url-pattern>/*</url-pattern> </filter-mapping>
> >>>>
> >>>> Also tried cors.allowed.headers.
> >>>>
> >>>> Any pointers?
> >>>>
> >>>>
> >>>
> >>> Alright, lets try this again.  Simple reproducible testcase...
> >>>
> >>> - download latest Tomcat 8 for Windows 64-bit zip
> >>> http://mirrors.ocf.berkeley.edu/apache/tomcat/tomcat-8/v8.0.32/bin/ap
> > ache-tomcat-8.0.32-windows-x64.zip
> >>>
> >>>
> > - extract somewhere
> >>> - delete everything in webapps folder - build project below, put
> >>> in webapps folder - go to: http://localhost:8080/one - check
> >>> response headers... no Warning header
> >>>
> >>> ** pom.xml **
> >>>
> >>> <project xmlns="http://maven.apache.org/POM/4.0.0";
> >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> >>> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> >>> http://maven.apache.org/maven-v4_0_0.xsd";>
> >>> <modelVersion>4.0.0</modelVersion>
> >>>
> >>> <groupId>test</groupId> <artifactId>tcTest</artifactId>
> >>> <packaging>war</packaging> <version>1.0-SNAPSHOT</version>
> >>>
> >>> <name>tcTest Maven Webapp</name>
> >>> <url>http://maven.apache.org</url>
> >>>
> >>> <dependencies> <dependency> <groupId>org.glassfish</groupId>
> >>> <artifactId>javax.servlet</artifactId> <version>3.1.1</version>
> >>> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId>
> >>> <artifactId>resteasy-client</artifactId>
> >>> <version>3.0.11.Final</version> </dependency> </dependencies>
> >>>
> >>> <build> <finalName>ROOT</finalName> </build> </project>
> >>>
> >>>
> >>> ** web.xml **
> >>>
> >>>
> >>> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
> >>> Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"; >
> >>>
> >>> <web-app> <display-name>Archetype Created Web
> >>> Application</display-name>
> >>>
> >>> <servlet> <servlet-name>One</servlet-name>
> >>> <servlet-class>pkg.ServletOne</servlet-class> </servlet>
> >>>
> >>> <servlet-mapping> <servlet-name>One</servlet-name>
> >>> <url-pattern>/one/*</url-pattern> </servlet-mapping>
> >>>
> >>> <servlet> <servlet-name>Two</servlet-name>
> >>> <servlet-class>pkg.ServletTwo</servlet-class> </servlet>
> >>>
> >>> <servlet-mapping> <servlet-name>Two</servlet-name>
> >>> <url-pattern>/two/*</url-pattern> </servlet-mapping> </web-app>
> >>>
> >>>
> >>> ** index.html **
> >>>
> >>>
> >>> <html> <body> <h2>Hello World!</h2> </body> </html>
> >>>
> >>>
> >>> ** Caller interface **
> >>>
> >>>
> >>> package pkg;
> >>>
> >>> import javax.ws.rs.GET; import javax.ws.rs.Path;
> >>>
> >>> public interface Caller { @GET @Path("two") String makeCall(); }
> >>>
> >>>
> >>>
> >>> ** Servlet one **
> >>>
> >>>
> >>> package pkg;
> >>>
> >>> import java.io.IOException;
> >>>
> >>> import javax.servlet.ServletException; import
> >>> javax.servlet.http.HttpServlet; import
> >>> javax.servlet.http.HttpServletRequest; import
> >>> javax.servlet.http.HttpServletResponse; import
> >>> javax.ws.rs.core.MediaType;
> >>>
> >>> import org.jboss.resteasy.client.ProxyBuilder;
> >>>
> >>> public class ServletOne extends HttpServlet { Caller caller;
> >>>
> >>> @Override public void init() throws ServletException { caller =
> >>> ProxyBuilder.build(Caller.class, "http://localhost:8080";).now();
> >>> }
> >>>
> >>> @Override protected void doGet(HttpServletRequest request,
> >>> HttpServletResponse response) throws ServletException,
> >>> IOException { String result = caller.makeCall();
> >>> response.getWriter().println(result); } }
> >>>
> >>>
> >>> ** Servlet two **
> >>>
> >>>
> >>> package pkg;
> >>>
> >>> import java.io.IOException;
> >>>
> >>> import javax.servlet.ServletException; import
> >>> javax.servlet.http.HttpServlet; import
> >>> javax.servlet.http.HttpServletRequest; import
> >>> javax.servlet.http.HttpServletResponse;
> >>>
> >>> public class ServletTwo extends HttpServlet { @Override protected
> >>> void doGet(HttpServletRequest request, HttpServletResponse
> >>> response) throws ServletException, IOException {
> >>> addHeader(response); response.getWriter().println("Ok"); }
> >>>
> >>> void addHeader(HttpServletResponse response) {
> >>> response.setHeader("Warning", "This is a warning"); // also tried
> >>> addHeader() } }
> >>>
> >
> >> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
> >> Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"; >
> >
> >> Should probably be:
> >
> >> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee";
> >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> >> xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
> >> http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"; version="3.1">
> >
> >> (sorry for the word wrapping).
> >
> >> I normally don't use web.xml in my 3.1 applications. I end up
> >> using annotations instead.
> >
> > It probably doesn't matter, since the servlet EG clarified that a
> > container needs to behave the same regardless of the spec-version
> > stated in the web.xml file. (Which I think is a very stupid position
> > to take.)
> >
> > The behavior is supposed to be whatever the highest spec-compliance
> > version the container supports (presumably). For example, you can use
> > servlet async along with a 2.3-version web.xml. More specifically, a
> > 2.3-version web.xml will still have its classes and libraries scanned
> > for annotations. :(
> >
> > -chris
>
> Ugh. Thanks I did not know that. From an operations and debugging
> standpoint, that's a mess.
>
> . . . not a happy operations camper
> /mde/
>
>
Ok so it seems like the difference is that the response is committed in the
Tomcat case when I set the Content-Length header but not in the Jetty
case.  I just so happened to add my Warning header in the line immediately
following that.  I have moved it up one and I'm rebuilding.  But I think
that may solve the issue.

Reply via email to