472422 - Custom status codes result in a NumberFormatException while using http2.
Fixed constructor that was passing the name as the value. Also other cleanups.
This commit is contained in:
parent
325c65a6cb
commit
9549001d8c
|
@ -19,6 +19,7 @@
|
|||
package org.eclipse.jetty.http;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
|
||||
/** A HTTP Field
|
||||
*/
|
||||
|
@ -30,24 +31,24 @@ public class HttpField
|
|||
private final String _value;
|
||||
// cached hashcode for case insensitive name
|
||||
private int hash = 0;
|
||||
|
||||
|
||||
public HttpField(HttpHeader header, String name, String value)
|
||||
{
|
||||
_header = header;
|
||||
_name = name;
|
||||
_value = value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public HttpField(HttpHeader header, String value)
|
||||
{
|
||||
this(header,header.asString(),value);
|
||||
}
|
||||
|
||||
|
||||
public HttpField(HttpHeader header, HttpHeaderValue value)
|
||||
{
|
||||
this(header,header.asString(),value.asString());
|
||||
}
|
||||
|
||||
|
||||
public HttpField(String name, String value)
|
||||
{
|
||||
this(HttpHeader.CACHE.get(name),name,value);
|
||||
|
@ -67,20 +68,20 @@ public class HttpField
|
|||
{
|
||||
return _value;
|
||||
}
|
||||
|
||||
|
||||
public int getIntValue()
|
||||
{
|
||||
return Integer.valueOf(_value);
|
||||
}
|
||||
|
||||
|
||||
public long getLongValue()
|
||||
{
|
||||
return Long.valueOf(_value);
|
||||
}
|
||||
|
||||
|
||||
public String[] getValues()
|
||||
{
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
{
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
int state = 0;
|
||||
int start=0;
|
||||
int end=0;
|
||||
|
@ -124,7 +125,7 @@ public class HttpField
|
|||
case '\t':
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
end=i;
|
||||
}
|
||||
break;
|
||||
|
@ -142,7 +143,7 @@ public class HttpField
|
|||
state=4;
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
builder.append(c);
|
||||
}
|
||||
break;
|
||||
|
@ -163,7 +164,7 @@ public class HttpField
|
|||
state=0;
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
throw new IllegalArgumentException("c="+(int)c);
|
||||
|
||||
}
|
||||
|
@ -187,7 +188,7 @@ public class HttpField
|
|||
|
||||
return list.toArray(new String[list.size()]);
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Look for a value in a possible multi valued field
|
||||
* @param search Values to search for
|
||||
|
@ -197,10 +198,12 @@ public class HttpField
|
|||
*/
|
||||
public boolean contains(String search)
|
||||
{
|
||||
if (_value==null || search==null)
|
||||
return _value==search;
|
||||
if (search==null)
|
||||
return _value==null;
|
||||
if (search.length()==0)
|
||||
return false;
|
||||
if (_value==null)
|
||||
return false;
|
||||
|
||||
int state=0;
|
||||
int match=0;
|
||||
|
@ -221,7 +224,7 @@ public class HttpField
|
|||
|
||||
case ',': // ignore leading empty field
|
||||
break;
|
||||
|
||||
|
||||
case ';': // ignore leading empty field parameter
|
||||
param=-1;
|
||||
match=-1;
|
||||
|
@ -253,8 +256,8 @@ public class HttpField
|
|||
param=match>=0?0:-1;
|
||||
state=5; // parameter
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
default:
|
||||
if (match>0)
|
||||
{
|
||||
if (match<search.length())
|
||||
|
@ -263,7 +266,7 @@ public class HttpField
|
|||
match=-1;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -278,14 +281,14 @@ public class HttpField
|
|||
state=4;
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
if (match>=0)
|
||||
{
|
||||
if (match<search.length())
|
||||
match=c==search.charAt(match)?(match+1):-1;
|
||||
else
|
||||
match=-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -296,7 +299,7 @@ public class HttpField
|
|||
match=c==search.charAt(match)?(match+1):-1;
|
||||
else
|
||||
match=-1;
|
||||
}
|
||||
}
|
||||
state=2;
|
||||
break;
|
||||
|
||||
|
@ -318,12 +321,12 @@ public class HttpField
|
|||
state=0;
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
// This is an illegal token, just ignore
|
||||
match=-1;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 5: // parameter
|
||||
switch(c)
|
||||
{
|
||||
|
@ -334,17 +337,17 @@ public class HttpField
|
|||
param=0;
|
||||
state=0;
|
||||
break;
|
||||
|
||||
|
||||
case ' ': // white space
|
||||
case '\t': // white space
|
||||
break;
|
||||
|
||||
default:
|
||||
default:
|
||||
if (param>=0)
|
||||
{
|
||||
if (param<__zeroquality.length())
|
||||
param=c==__zeroquality.charAt(param)?(param+1):-1;
|
||||
else if (c!='0'&&c!='.'&&c!=' ')
|
||||
else if (c!='0'&&c!='.')
|
||||
param=-1;
|
||||
}
|
||||
|
||||
|
@ -355,11 +358,11 @@ public class HttpField
|
|||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return param!=__zeroquality.length() && match==search.length();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
|
@ -379,7 +382,7 @@ public class HttpField
|
|||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
private int nameHashCode()
|
||||
{
|
||||
int h = this.hash;
|
||||
|
@ -422,92 +425,78 @@ public class HttpField
|
|||
return false;
|
||||
if (_value==null && field.getValue()!=null)
|
||||
return false;
|
||||
if (!_value.equals(field.getValue()))
|
||||
return false;
|
||||
return true;
|
||||
return Objects.equals(_value,field.getValue());
|
||||
}
|
||||
|
||||
|
||||
public static class IntValueHttpField extends HttpField
|
||||
{
|
||||
final int _int;
|
||||
|
||||
private final int _int;
|
||||
|
||||
public IntValueHttpField(HttpHeader header, String name, String value, int intValue)
|
||||
{
|
||||
super(header,name,value);
|
||||
_int=intValue;
|
||||
}
|
||||
|
||||
public IntValueHttpField(HttpHeader header, String value, int intValue)
|
||||
{
|
||||
this(header,header.asString(),value,Integer.valueOf(value));
|
||||
}
|
||||
|
||||
public IntValueHttpField(HttpHeader header, String name, String value)
|
||||
{
|
||||
this(header,name,value,Integer.valueOf(value));
|
||||
}
|
||||
|
||||
public IntValueHttpField(HttpHeader header, String value)
|
||||
public IntValueHttpField(HttpHeader header, String name, int intValue)
|
||||
{
|
||||
this(header,header.asString(),value);
|
||||
this(header,name,Integer.toString(intValue),intValue);
|
||||
}
|
||||
|
||||
public IntValueHttpField(HttpHeader header, int value)
|
||||
{
|
||||
this(header,header.asString(),value);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getIntValue()
|
||||
{
|
||||
return _int;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public long getLongValue()
|
||||
{
|
||||
return _int;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class LongValueHttpField extends HttpField
|
||||
{
|
||||
final long _long;
|
||||
|
||||
private final long _long;
|
||||
|
||||
public LongValueHttpField(HttpHeader header, String name, String value, long longValue)
|
||||
{
|
||||
super(header,name,value);
|
||||
_long=longValue;
|
||||
}
|
||||
|
||||
|
||||
public LongValueHttpField(HttpHeader header, String name, String value)
|
||||
{
|
||||
this(header,name,value,Long.valueOf(value));
|
||||
}
|
||||
|
||||
|
||||
public LongValueHttpField(HttpHeader header, String name, long value)
|
||||
{
|
||||
this(header,name,Long.toString(value),value);
|
||||
}
|
||||
|
||||
public LongValueHttpField(HttpHeader header, String value)
|
||||
{
|
||||
this(header,header.asString(),value);
|
||||
}
|
||||
|
||||
|
||||
public LongValueHttpField(HttpHeader header,long value)
|
||||
{
|
||||
this(header,header.asString(),value);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getIntValue()
|
||||
{
|
||||
return (int)_long;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public long getLongValue()
|
||||
{
|
||||
|
|
|
@ -166,4 +166,37 @@ public class HTTP2Test extends AbstractTest
|
|||
|
||||
Assert.assertTrue(latch.await(requests, TimeUnit.SECONDS));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomResponseCode() throws Exception
|
||||
{
|
||||
final int status = 475;
|
||||
start(new HttpServlet()
|
||||
{
|
||||
@Override
|
||||
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||
{
|
||||
response.setStatus(status);
|
||||
}
|
||||
});
|
||||
|
||||
Session session = newClient(new Session.Listener.Adapter());
|
||||
HttpFields fields = new HttpFields();
|
||||
MetaData.Request metaData = newRequest("GET", fields);
|
||||
HeadersFrame frame = new HeadersFrame(1, metaData, null, true);
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
|
||||
{
|
||||
@Override
|
||||
public void onHeaders(Stream stream, HeadersFrame frame)
|
||||
{
|
||||
MetaData.Response response = (MetaData.Response)frame.getMetaData();
|
||||
Assert.assertEquals(status, response.getStatus());
|
||||
if (frame.isEndStream())
|
||||
latch.countDown();
|
||||
}
|
||||
});
|
||||
|
||||
Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue