I also don't understand how does this patch fixes a bug (if it's a bug) in MediaTypeHeaderDelegate, which fails to parse "/" media type.
On Wed, Sep 16, 2009 at 5:20 PM, Michael Elman <[email protected]> wrote: > I'm probably missing something, but what exactly the following code > perfoms? > acceptValue = null; > - } else { > + } else if (requestHeader.size() > 0) { > StringBuilder acceptValueTemp = new StringBuilder(); > acceptValueTemp.append( >> >> requestHeader.get(0)); >> for (int c = 1; c < requestHeader.size(); ++c) { >> @@ -125,6 +125,8 @@ >> acceptValueTemp.append(requestHeader.get(c)); >> } >> acceptValue = acceptValueTemp.toString(); >> + } else { >> + acceptValue = requestHeader.get(0); >> } >> > > > > > > > On Wed, Sep 16, 2009 at 5:04 PM, <[email protected]> wrote: > >> Author: bluk >> Date: Wed Sep 16 14:04:54 2009 >> New Revision: 815790 >> >> URL: http://svn.apache.org/viewvc?rev=815790&view=rev >> Log: >> Check for null return values from headers >> >> Thanks Kaloyan Kolev for reporting the issue. >> >> See [WINK-188] >> >> Added: >> >> >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/ >> >> >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java >> (with props) >> Modified: >> >> >> incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/contexts/HttpHeadersImpl.java >> >> Modified: >> incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/contexts/HttpHeadersImpl.java >> URL: >> http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/contexts/HttpHeadersImpl.java?rev=815790&r1=815789&r2=815790&view=diff >> >> ============================================================================== >> --- >> incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/contexts/HttpHeadersImpl.java >> (original) >> +++ >> incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/contexts/HttpHeadersImpl.java >> Wed Sep 16 14:04:54 2009 >> @@ -117,7 +117,7 @@ >> List<String> requestHeader = >> getRequestHeader(HttpHeaders.ACCEPT); >> if (requestHeader == null || requestHeader.isEmpty()) { >> acceptValue = null; >> - } else { >> + } else if (requestHeader.size() > 0) { >> StringBuilder acceptValueTemp = new StringBuilder(); >> acceptValueTemp.append(requestHeader.get(0)); >> for (int c = 1; c < requestHeader.size(); ++c) { >> @@ -125,6 +125,8 @@ >> acceptValueTemp.append(requestHeader.get(c)); >> } >> acceptValue = acceptValueTemp.toString(); >> + } else { >> + acceptValue = requestHeader.get(0); >> } >> } >> try { >> @@ -189,13 +191,17 @@ >> 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()) { >> - list.add((String)headerValues.nextElement()); >> + String val = (String)headerValues.nextElement(); >> + if (val != null) { >> + list.add(val); >> + } >> } >> >> headers.put(name, list); >> @@ -237,7 +243,10 @@ >> >> msgContext.getAttribute(HttpServletRequest.class).getHeaders(name); >> List<String> values = new ArrayList<String>(); >> while (headerValues.hasMoreElements()) { >> - values.add((String)headerValues.nextElement()); >> + String val = (String)headerValues.nextElement(); >> + if (val != null) { >> + values.add(val); >> + } >> } >> map.put(name, values); >> } >> >> Added: >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java >> URL: >> http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java?rev=815790&view=auto >> >> ============================================================================== >> --- >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java >> (added) >> +++ >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java >> Wed Sep 16 14:04:54 2009 >> @@ -0,0 +1,449 @@ >> +/* >> + * Licensed to the Apache Software Foundation (ASF) under one >> + * or more contributor license agreements. See the NOTICE file >> + * distributed with this work for additional information >> + * regarding copyright ownership. The ASF licenses this file >> + * to you under the Apache License, Version 2.0 (the >> + * "License"); you may not use this file except in compliance >> + * with the License. You may obtain a copy of the License at >> + * >> + * http://www.apache.org/licenses/LICENSE-2.0 >> + * >> + * Unless required by applicable law or agreed to in writing, >> + * software distributed under the License is distributed on an >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >> + * KIND, either express or implied. See the License for the >> + * specific language governing permissions and limitations >> + * under the License. >> + */ >> + >> +package org.apache.wink.server.internal.contexts; >> + >> +import java.io.BufferedReader; >> +import java.io.IOException; >> +import java.io.PrintWriter; >> +import java.io.UnsupportedEncodingException; >> +import java.security.Principal; >> +import java.util.Collections; >> +import java.util.Enumeration; >> +import java.util.List; >> +import java.util.Locale; >> +import java.util.Map; >> +import java.util.Vector; >> + >> +import javax.servlet.RequestDispatcher; >> +import javax.servlet.ServletInputStream; >> +import javax.servlet.ServletOutputStream; >> +import javax.servlet.http.Cookie; >> +import javax.servlet.http.HttpServletRequest; >> +import javax.servlet.http.HttpServletResponse; >> +import javax.servlet.http.HttpSession; >> +import javax.ws.rs.core.MediaType; >> + >> +import junit.framework.TestCase; >> + >> +import org.apache.wink.server.internal.DeploymentConfiguration; >> +import org.apache.wink.server.internal.handlers.ServerMessageContext; >> + >> +public class HttpHeadersImplTest extends TestCase { >> + >> + /** >> + * Tests that null values returned for header values are ignored. See >> + * [WINK-188] >> + */ >> + public void testRequestHeaderReturnsNull() { >> + >> + ServerMessageContext context = new ServerMessageContext(new >> HttpServletRequest() { >> + >> + public void setCharacterEncoding(String arg0) throws >> UnsupportedEncodingException { >> + >> + } >> + >> + public void setAttribute(String arg0, Object arg1) { >> + >> + } >> + >> + public void removeAttribute(String arg0) { >> + >> + } >> + >> + public boolean isSecure() { >> + >> + return false; >> + } >> + >> + public int getServerPort() { >> + >> + return 0; >> + } >> + >> + public String getServerName() { >> + >> + return null; >> + } >> + >> + public String getScheme() { >> + >> + return null; >> + } >> + >> + public RequestDispatcher getRequestDispatcher(String arg0) { >> + >> + return null; >> + } >> + >> + public int getRemotePort() { >> + >> + return 0; >> + } >> + >> + public String getRemoteHost() { >> + >> + return null; >> + } >> + >> + public String getRemoteAddr() { >> + >> + return null; >> + } >> + >> + public String getRealPath(String arg0) { >> + >> + return null; >> + } >> + >> + public BufferedReader getReader() throws IOException { >> + >> + return null; >> + } >> + >> + public String getProtocol() { >> + >> + return null; >> + } >> + >> + public String[] getParameterValues(String arg0) { >> + >> + return null; >> + } >> + >> + public Enumeration getParameterNames() { >> + >> + return null; >> + } >> + >> + public Map getParameterMap() { >> + >> + return null; >> + } >> + >> + public String getParameter(String arg0) { >> + >> + return null; >> + } >> + >> + public Enumeration getLocales() { >> + >> + return null; >> + } >> + >> + public Locale getLocale() { >> + >> + return null; >> + } >> + >> + public int getLocalPort() { >> + >> + return 0; >> + } >> + >> + public String getLocalName() { >> + >> + return null; >> + } >> + >> + public String getLocalAddr() { >> + return null; >> + } >> + >> + public ServletInputStream getInputStream() throws IOException >> { >> + return null; >> + } >> + >> + public String getContentType() { >> + return null; >> + } >> + >> + public int getContentLength() { >> + return 0; >> + } >> + >> + public String getCharacterEncoding() { >> + return null; >> + } >> + >> + public Enumeration getAttributeNames() { >> + return null; >> + } >> + >> + public Object getAttribute(String arg0) { >> + return null; >> + } >> + >> + public boolean isUserInRole(String arg0) { >> + return false; >> + } >> + >> + public boolean isRequestedSessionIdValid() { >> + return false; >> + } >> + >> + public boolean isRequestedSessionIdFromUrl() { >> + return false; >> + } >> + >> + public boolean isRequestedSessionIdFromURL() { >> + return false; >> + } >> + >> + public boolean isRequestedSessionIdFromCookie() { >> + return false; >> + } >> + >> + public Principal getUserPrincipal() { >> + return null; >> + } >> + >> + public HttpSession getSession(boolean arg0) { >> + return null; >> + } >> + >> + public HttpSession getSession() { >> + return null; >> + } >> + >> + public String getServletPath() { >> + return null; >> + } >> + >> + public String getRequestedSessionId() { >> + return null; >> + } >> + >> + public StringBuffer getRequestURL() { >> + return null; >> + } >> + >> + public String getRequestURI() { >> + return null; >> + } >> + >> + public String getRemoteUser() { >> + return null; >> + } >> + >> + public String getQueryString() { >> + return null; >> + } >> + >> + public String getPathTranslated() { >> + return null; >> + } >> + >> + public String getPathInfo() { >> + return null; >> + } >> + >> + public String getMethod() { >> + return null; >> + } >> + >> + public int getIntHeader(String arg0) { >> + return 0; >> + } >> + >> + public Enumeration getHeaders(String arg0) { >> + if ("Accept".equals(arg0)) { >> + Vector<String> values = new Vector<String>(); >> + values.add("text/xml"); >> + values.add(null); >> + return values.elements(); >> + } >> + return null; >> + } >> + >> + public Enumeration getHeaderNames() { >> + Vector<String> headers = new >> Vector<String>(Collections.singletonList("Accept")); >> + return headers.elements(); >> + } >> + >> + public String getHeader(String arg0) { >> + return null; >> + } >> + >> + public long getDateHeader(String arg0) { >> + return 0; >> + } >> + >> + public Cookie[] getCookies() { >> + return null; >> + } >> + >> + public String getContextPath() { >> + return null; >> + } >> + >> + public String getAuthType() { >> + return null; >> + } >> + }, new HttpServletResponse() { >> + >> + public void setLocale(Locale arg0) { >> + >> + } >> + >> + public void setContentType(String arg0) { >> + >> + } >> + >> + public void setContentLength(int arg0) { >> + >> + } >> + >> + public void setCharacterEncoding(String arg0) { >> + >> + } >> + >> + public void setBufferSize(int arg0) { >> + >> + } >> + >> + public void resetBuffer() { >> + >> + } >> + >> + public void reset() { >> + >> + } >> + >> + public boolean isCommitted() { >> + >> + return false; >> + } >> + >> + public PrintWriter getWriter() throws IOException { >> + >> + return null; >> + } >> + >> + public ServletOutputStream getOutputStream() throws >> IOException { >> + >> + return null; >> + } >> + >> + public Locale getLocale() { >> + >> + return null; >> + } >> + >> + public String getContentType() { >> + >> + return null; >> + } >> + >> + public String getCharacterEncoding() { >> + >> + return null; >> + } >> + >> + public int getBufferSize() { >> + >> + return 0; >> + } >> + >> + public void flushBuffer() throws IOException { >> + >> + } >> + >> + public void setStatus(int arg0, String arg1) { >> + >> + } >> + >> + public void setStatus(int arg0) { >> + >> + } >> + >> + public void setIntHeader(String arg0, int arg1) { >> + >> + } >> + >> + public void setHeader(String arg0, String arg1) { >> + >> + } >> + >> + public void setDateHeader(String arg0, long arg1) { >> + >> + } >> + >> + public void sendRedirect(String arg0) throws IOException { >> + >> + } >> + >> + public void sendError(int arg0, String arg1) throws >> IOException { >> + >> + } >> + >> + public void sendError(int arg0) throws IOException { >> + >> + } >> + >> + public String encodeUrl(String arg0) { >> + >> + return null; >> + } >> + >> + public String encodeURL(String arg0) { >> + >> + return null; >> + } >> + >> + public String encodeRedirectUrl(String arg0) { >> + >> + return null; >> + } >> + >> + public String encodeRedirectURL(String arg0) { >> + >> + return null; >> + } >> + >> + public boolean containsHeader(String arg0) { >> + >> + return false; >> + } >> + >> + public void addIntHeader(String arg0, int arg1) { >> + >> + } >> + >> + public void addHeader(String arg0, String arg1) { >> + >> + } >> + >> + public void addDateHeader(String arg0, long arg1) { >> + >> + } >> + >> + public void addCookie(Cookie arg0) { >> + >> + } >> + }, new DeploymentConfiguration() { >> + }); >> + >> + HttpHeadersImpl headers = new HttpHeadersImpl(context); >> + List<MediaType> mediaTypes = headers.getAcceptableMediaTypes(); >> + assertEquals(1, mediaTypes.size()); >> + assertEquals(MediaType.TEXT_XML_TYPE, >> headers.getAcceptableMediaTypes().get(0)); >> + } >> + >> +} >> >> Propchange: >> incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/contexts/HttpHeadersImplTest.java >> >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> >> >
