You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wink.apache.org by "Kaloyan Kolev (JIRA)" <ji...@apache.org> on 2009/09/16 15:09:59 UTC

[jira] Created: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

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
             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]

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

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


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:

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);
}



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Michael Elman updated WINK-188:
-------------------------------

    Description: 
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}

  was:
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]

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

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


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}


> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756060#action_12756060 ] 

Michael Elman commented on WINK-188:
------------------------------------

So I guess it should be :
{code}
if (requestHeader.size() > 1) {
{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.


[jira] Updated: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Michael Elman updated WINK-188:
-------------------------------

    Description: 
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]

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

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


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}

  was:
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]

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

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


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:

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);
}




Added \{code\} tag

> 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]
> 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
> 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
> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Hudson (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756091#action_12756091 ] 

Hudson commented on WINK-188:
-----------------------------

Integrated in Wink-Trunk-JDK1.5 #158 (See [http://hudson.zones.apache.org/hudson/job/Wink-Trunk-JDK1.5/158/])
    Fix for size() > 0 issue

Thanks to Michael Elman for pointing it out.

See []


> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Kaloyan Kolev (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756063#action_12756063 ] 

Kaloyan Kolev commented on WINK-188:
------------------------------------

Yes, that is what I meant :)

> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756042#action_12756042 ] 

Michael Elman commented on WINK-188:
------------------------------------

Looking at 
{code}text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8{code}
Is / a correct media type?
I don't think so...

> 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]
> 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
> 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
> 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.


[jira] Assigned: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Bryant Luk (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bryant Luk reassigned WINK-188:
-------------------------------

    Assignee: Bryant Luk

> 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]
> 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
> 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
> 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:
> 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);
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Kaloyan Kolev (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756047#action_12756047 ] 

Kaloyan Kolev commented on WINK-188:
------------------------------------

You are correct but this is something the forum is doing to my note... let me put it in a code section:

The HTTP Request headers looks like this:
{code}
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}

Thanks.


> 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]
> 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
> 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
> 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.


[jira] Resolved: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Bryant Luk (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bryant Luk resolved WINK-188.
-----------------------------

    Resolution: Fixed

Added the fix.  Thanks Kaloyan.

> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Kaloyan Kolev (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756053#action_12756053 ] 

Kaloyan Kolev commented on WINK-188:
------------------------------------

That part is the same as before but with the ability to handle the case when you end up having a single value in the list. For that case we don't need to create a new instance of the StringBuilder to get the same string at the end. Basically it is a performance optimization.

Thanks.

> 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.


[jira] Issue Comment Edited: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
    [ 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Bryant Luk (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756057#action_12756057 ] 

Bryant Luk commented on WINK-188:
---------------------------------

Ahh haven't had my morning coffee.  I'll make the fix to that last bit.

> 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.


[jira] Issue Comment Edited: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756060#action_12756060 ] 

Michael Elman edited comment on WINK-188 at 9/16/09 7:44 AM:
-------------------------------------------------------------

So I guess it should be :
{code}
if (requestHeader.size() > 1) {
{code}
Currently it does nothing...

      was (Author: elman):
    So I guess it should be :
{code}
if (requestHeader.size() > 1) {
{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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Hudson (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756062#action_12756062 ] 

Hudson commented on WINK-188:
-----------------------------

Integrated in Wink-Trunk-JDK1.5 #157 (See [http://hudson.zones.apache.org/hudson/job/Wink-Trunk-JDK1.5/157/])
    Check for null return values from headers

Thanks Kaloyan Kolev for reporting the issue.

See []


> 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.


[jira] Issue Comment Edited: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Kaloyan Kolev (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756053#action_12756053 ] 

Kaloyan Kolev edited comment on WINK-188 at 9/16/09 7:40 AM:
-------------------------------------------------------------

That part is the same as before but with the ability to handle the case when you end up having a single value in the list. For that case we don't need to create a new instance of the StringBuilder to get the same string at the end. Basically it is a performance optimization.

Here is a string representation of the list in my case before doing the check for nulls
{code}
["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", null, null, null, null, null, null, null, null, null]
{code}

and here is the same list without the null elements which reaches the case you are asking about:
{code}
["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",]
{code}

Thanks.

      was (Author: kkolev):
    That part is the same as before but with the ability to handle the case when you end up having a single value in the list. For that case we don't need to create a new instance of the StringBuilder to get the same string at the end. Basically it is a performance optimization.

Thanks.
  
> 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.


[jira] Commented: (WINK-188) org.apache.wink.server.internal.contexts.HttpHeadersImpl#getRequestHeaderInternal(String) should check for invalid values.

Posted by "Michael Elman (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12756052#action_12756052 ] 

Michael Elman commented on WINK-188:
------------------------------------

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.