diff --git a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java index 442ede453a8..47112c7e7fb 100644 --- a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java +++ b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java @@ -310,7 +310,28 @@ public String getHeader(String s, boolean checkCase) { } if (s.startsWith(X_ATMOSPHERE) && isNotNoOps()) { - name = (String) b.request.getAttribute(s); + // Craziness with Struts 2 who wraps String attribute as BigDecimal + // https://github.com/Atmosphere/atmosphere/issues/1367 + Object o = b.request.getAttribute(s); + if (o == null || String.class.isAssignableFrom(o.getClass())) { + name = String.class.cast(o); + } else { + try { + if (HttpServletRequestWrapper.class.isAssignableFrom(b.request.getClass())) { + HttpServletRequest hsr = HttpServletRequestWrapper.class.cast(b.request); + while (hsr instanceof HttpServletRequestWrapper) { + hsr = (HttpServletRequest) ((HttpServletRequestWrapper) hsr).getRequest(); + o = hsr.getAttribute(s); + if (o == null || String.class.isAssignableFrom(o.getClass())) { + name = String.class.cast(o); + break; + } + } + } + } catch (Exception ex) { + logger.warn("", ex); + } + } } }