[
https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756052#action_12756052
]
Michael Elman edited comment on WINK-188 at 9/16/09 7:35 AM:
-------------------------------------------------------------
Ok, now I understand your fix, except of the first part:
{code}
if (requestHeader == null || requestHeader.isEmpty()) {
acceptValue = null;
} else if (requestHeader.size() > 0) {
StringBuilder acceptValueTemp = new StringBuilder();
acceptValueTemp.append(requestHeader.get(0));
for (int c = 1; c < requestHeader.size(); ++c) {
acceptValueTemp.append(",");
acceptValueTemp.append(requestHeader.get(c));
}
acceptValue = acceptValueTemp.toString();
} else {
acceptValue = requestHeader.get(0);
}
{code}
what does it performs?
I don't see how the last else is reachable...
was (Author: elman):
Ok, now I understand your fix, except of the first part:
{code}
if (requestHeader == null || requestHeader.isEmpty()) {
acceptValue = null;
} else if (requestHeader.size() > 0) {
StringBuilder acceptValueTemp = new StringBuilder();
acceptValueTemp.append(requestHeader.get(0));
for (int c = 1; c < requestHeader.size(); ++c) {
acceptValueTemp.append(",");
acceptValueTemp.append(requestHeader.get(c));
}
acceptValue = acceptValueTemp.toString();
} else {
acceptValue = requestHeader.get(0);
}
{code}
> org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String)
> should check for invalid values.
> --------------------------------------------------------------------------------------------------------------------------
>
> Key: WINK-188
> URL: https://issues.apache.org/jira/browse/WINK-188
> Project: Wink
> Issue Type: Bug
> Components: Server
> Affects Versions: 0.2
> Environment: IBM Lotus Expeditor's Web Container - LWI 7.1.1.
> Reporter: Kaloyan Kolev
> Assignee: Bryant Luk
> Fix For: 0.2
>
>
> The
> org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String)
> gets the values of the Accept header from an instance of the
> javax.servlet.http.HttpServletRequest which in our case is of type
> com.ibm.ws.webcontainer.srt.SRTServletRequest. The returned enumeration of
> header values contains the following elements:
> [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, null, null,
> null, null, null, null, null, null, null]
> {code}
> The HTTP Request headers looks like this:
> Host: localhost:13100
> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.3)
> Gecko/20090824 Firefox/3.5.3
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language: bg,en-us;q=0.7,en;q=0.3
> Accept-Encoding: gzip,deflate
> Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
> Keep-Alive: 300
> Connection: keep-alive
> Content-Type: text/html
> {code}
> {code}
> The thrown exception is:
> javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException:
> Wrong MediaType format for MediaType: {}
> at
> org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptHeader(HttpHeadersImpl.java:132)
> at
> org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptableMediaTypes(HttpHeadersImpl.java:93)
> at
> org.apache.wink.server.internal.registry.ResourceRegistry.filterByProduces(ResourceRegistry.java:473)
> at
> org.apache.wink.server.internal.registry.ResourceRegistry.filterDispatchMethods(ResourceRegistry.java:397)
> at
> org.apache.wink.server.internal.registry.ResourceRegistry.findMethod(ResourceRegistry.java:281)
> at
> org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleResourceMethod(FindResourceMethodHandler.java:123)
> at
> org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:58)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:55)
> at
> org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:99)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:55)
> at
> org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:47)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:55)
> at
> org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:42)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:55)
> at
> org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> at
> org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:55)
> at
> org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:43)
> at
> org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:137)
> at
> org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:118)
> at
> org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:103)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
> at
> com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:971)
> at
> com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:477)
> at
> com.ibm.pvc.internal.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:86)
> at
> com.ibm.pvc.internal.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:102)
> at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3124)
> at
> com.ibm.pvc.internal.webcontainer.webapp.BundleWebApp.handleRequest(BundleWebApp.java:451)
> at
> com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:235)
> at
> com.ibm.pvc.internal.webcontainer.VirtualHost.handleRequest(VirtualHost.java:96)
> at
> com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:811)
> at
> com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:41)
> at
> com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:464)
> at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:355)
> at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1498)
> Caused by:
> java.lang.IllegalArgumentException: Wrong MediaType format for MediaType: {}
> at
> org.apache.wink.common.internal.providers.header.MediaTypeHeaderDelegate.fromString(MediaTypeHeaderDelegate.java:78)
> at
> org.apache.wink.common.internal.providers.header.MediaTypeHeaderDelegate.fromString(MediaTypeHeaderDelegate.java:34)
> at javax.ws.rs.core.MediaType.valueOf(MediaType.java:119)
> at
> org.apache.wink.common.internal.providers.header.AcceptHeaderDelegate.fromString(AcceptHeaderDelegate.java:55)
> at
> org.apache.wink.common.internal.providers.header.AcceptHeaderDelegate.fromString(AcceptHeaderDelegate.java:33)
> at org.apache.wink.common.internal.http.Accept.valueOf(Accept.java:139)
> at
> org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptHeader(HttpHeadersImpl.java:129)
> ... 43 more
> Caused by:
> java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
> at
> org.apache.wink.common.internal.providers.header.MediaTypeHeaderDelegate.fromString(MediaTypeHeaderDelegate.java:65)
> ... 49 more
> {code}
> I am not sure what the reason for returning null elements in the enumeration
> is, but I think a check for this should be made. Here is how it might look:
> org.apache.wink.server.internal.contexts.HttpHeadersImpl:
> {code}
> private Accept getAcceptHeader() {
> String alternateParameter =
> msgContext.getUriInfo().getQueryParameters().getFirst(RestConstants.REST_PARAM_MEDIA_TYPE);
> String acceptValue = null;
> if (alternateParameter != null) {
> // try to map alternate parameter shortcut to a real media type
> DeploymentConfiguration deploymentConfiguration =
> msgContext.getAttribute(DeploymentConfiguration.class);
> Map<String, String> alternateShortcutMap =
> deploymentConfiguration.getAlternateShortcutMap();
> if (alternateShortcutMap != null) {
> acceptValue =
> alternateShortcutMap.get(alternateParameter);
> }
> if (acceptValue == null) {
> acceptValue = alternateParameter;
> }
> } else {
> List<String> requestHeader =
> getRequestHeader(HttpHeaders.ACCEPT);
> if (requestHeader == null || requestHeader.isEmpty()) {
> acceptValue = null;
> } else if (requestHeader.size() > 0) {
> StringBuilder acceptValueTemp = new StringBuilder();
> acceptValueTemp.append(requestHeader.get(0));
> for (int c = 1; c < requestHeader.size(); ++c) {
> acceptValueTemp.append(",");
> acceptValueTemp.append(requestHeader.get(c));
> }
> acceptValue = acceptValueTemp.toString();
> } else {
> acceptValue = requestHeader.get(0);
> }
> }
> try {
> Accept acceptHeader = Accept.valueOf(acceptValue);
> return acceptHeader;
> } catch (IllegalArgumentException e) {
> throw new WebApplicationException(e, 400);
> }
> }
> private List<String> getRequestHeaderInternal(String name) {
> if (allHeaders != null) {
> return allHeaders.get(name);
> }
> List<String> list = headers.get(name);
> if (list == null) {
> Enumeration<?> headerValues =
> msgContext.getAttribute(HttpServletRequest.class).getHeaders(name);
> list = new ArrayList<String>();
> while (headerValues.hasMoreElements()) {
> String val = (String) headerValues.nextElement();
> if (val != null) {
> list.add(val);
> }
> }
> headers.put(name, list);
> }
> return list;
> }
> private MultivaluedMap<String, String> buildRequestHeaders() {
> MultivaluedMap<String, String> map = new
> CaseInsensitiveMultivaluedMap<String>();
> Enumeration<?> names =
> msgContext.getAttribute(HttpServletRequest.class).getHeaderNames();
> if (names == null) {
> return map;
> }
> while (names.hasMoreElements()) {
> String name = (String) names.nextElement();
> Enumeration<?> headerValues =
> msgContext.getAttribute(HttpServletRequest.class).getHeaders(name);
> List<String> values = new ArrayList<String>();
> while (headerValues.hasMoreElements()) {
> String val = (String) headerValues.nextElement();
> if (val != null) {
> values.add(val);
> }
> }
> map.put(name, values);
> }
> return new UnmodifiableMultivaluedMap<String, String>(map);
> }
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.