Issue #9554 - add javadoc for illegal vchar methods and move to HttpTokens
Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
This commit is contained in:
parent
c3b6b47915
commit
09e6e6b211
|
@ -231,5 +231,60 @@ public class HttpTokens
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used when decoding to not decode illegal characters based on RFC9110.
|
||||
* CR, LF, or NUL are replaced with ' ', all other control and multibyte characters
|
||||
* are replaced with '?'. If this is given a legal character the same value will be returned.
|
||||
*
|
||||
* @param c the character to test.
|
||||
* @return the original character or the replacement character ' ' or '?'.
|
||||
*/
|
||||
public static char sanitizeFieldVchar(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
// A recipient of CR, LF, or NUL within a field value MUST either reject the message
|
||||
// or replace each of those characters with SP before further processing
|
||||
case '\r':
|
||||
case '\n':
|
||||
case 0x00:
|
||||
return ' ';
|
||||
|
||||
default:
|
||||
if (c >= 256 || c < ' ')
|
||||
return '?';
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used when decoding to not decode illegal characters based on RFC9110.
|
||||
* CR, LF, or NUL are replaced with ' ', all other control and multibyte characters
|
||||
* are replaced with '?'. If this is given a legal character the same value will be returned.
|
||||
*
|
||||
* @param i the character to test.
|
||||
* @return the original character or the replacement character ' ' or '?'.
|
||||
*/
|
||||
public static int sanitizeFieldVchar(int i)
|
||||
{
|
||||
if (i > Character.MAX_VALUE)
|
||||
return '?';
|
||||
return sanitizeFieldVchar((char)i);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether this is an invalid VCHAR based on RFC9110.
|
||||
* If this not a valid ISO-8859-1 character or a control character
|
||||
* we say that it is illegal.
|
||||
*
|
||||
* @param c the character to test.
|
||||
* @return true if this is invalid VCHAR.
|
||||
*/
|
||||
public static boolean isIllegalFieldVchar(char c)
|
||||
{
|
||||
return (c >= 256 || c < ' ');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -346,47 +346,4 @@ public class Huffman
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isIllegalCharacter(char c)
|
||||
{
|
||||
return (c >= 256 || c < ' ');
|
||||
}
|
||||
|
||||
public static char getReplacementCharacter(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
// A recipient of CR, LF, or NUL within a field value MUST either reject the message
|
||||
// or replace each of those characters with SP before further processing
|
||||
case '\r':
|
||||
case '\n':
|
||||
case 0x00:
|
||||
return ' ';
|
||||
|
||||
default:
|
||||
if (c >= 256 || c < ' ')
|
||||
return '?';
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
public static int getReplacementCharacter(int i)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
// A recipient of CR, LF, or NUL within a field value MUST either reject the message
|
||||
// or replace each of those characters with SP before further processing
|
||||
case '\r':
|
||||
case '\n':
|
||||
case 0x00:
|
||||
return ' ';
|
||||
|
||||
default:
|
||||
if (i >= 256 || i < ' ')
|
||||
return '?';
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ package org.eclipse.jetty.http.compression;
|
|||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.eclipse.jetty.http.HttpTokens;
|
||||
import org.eclipse.jetty.util.CharsetStringBuilder;
|
||||
|
||||
import static org.eclipse.jetty.http.compression.Huffman.rowbits;
|
||||
|
@ -72,7 +73,7 @@ public class HuffmanDecoder
|
|||
|
||||
// terminal node
|
||||
int i = 0xFF & rowsym[_node];
|
||||
i = Huffman.getReplacementCharacter(i);
|
||||
i = HttpTokens.sanitizeFieldVchar(i);
|
||||
_builder.append((byte)i);
|
||||
_bits -= rowbits[_node];
|
||||
_node = 0;
|
||||
|
@ -107,7 +108,7 @@ public class HuffmanDecoder
|
|||
}
|
||||
|
||||
int i = 0xFF & rowsym[_node];
|
||||
i = Huffman.getReplacementCharacter(i);
|
||||
i = HttpTokens.sanitizeFieldVchar(i);
|
||||
_builder.append((byte)i);
|
||||
_bits -= rowbits[_node];
|
||||
_node = 0;
|
||||
|
|
|
@ -15,6 +15,8 @@ package org.eclipse.jetty.http.compression;
|
|||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.eclipse.jetty.http.HttpTokens;
|
||||
|
||||
import static org.eclipse.jetty.http.compression.Huffman.CODES;
|
||||
import static org.eclipse.jetty.http.compression.Huffman.LCCODES;
|
||||
|
||||
|
@ -67,7 +69,7 @@ public class HuffmanEncoder
|
|||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
char c = s.charAt(i);
|
||||
if (Huffman.isIllegalCharacter(c))
|
||||
if (HttpTokens.isIllegalFieldVchar(c))
|
||||
return -1;
|
||||
needed += table[c][1];
|
||||
}
|
||||
|
@ -88,7 +90,7 @@ public class HuffmanEncoder
|
|||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
char c = s.charAt(i);
|
||||
if (Huffman.isIllegalCharacter(c))
|
||||
if (HttpTokens.isIllegalFieldVchar(c))
|
||||
throw new IllegalArgumentException();
|
||||
int code = table[c][0];
|
||||
int bits = table[c][1];
|
||||
|
|
|
@ -25,10 +25,10 @@ import org.eclipse.jetty.http.HttpHeader;
|
|||
import org.eclipse.jetty.http.HttpMethod;
|
||||
import org.eclipse.jetty.http.HttpScheme;
|
||||
import org.eclipse.jetty.http.HttpStatus;
|
||||
import org.eclipse.jetty.http.HttpTokens;
|
||||
import org.eclipse.jetty.http.HttpVersion;
|
||||
import org.eclipse.jetty.http.MetaData;
|
||||
import org.eclipse.jetty.http.PreEncodedHttpField;
|
||||
import org.eclipse.jetty.http.compression.Huffman;
|
||||
import org.eclipse.jetty.http.compression.HuffmanEncoder;
|
||||
import org.eclipse.jetty.http.compression.NBitIntegerEncoder;
|
||||
import org.eclipse.jetty.http2.hpack.HpackContext.Entry;
|
||||
|
@ -468,7 +468,7 @@ public class HpackEncoder
|
|||
for (int i = 0; i < value.length(); i++)
|
||||
{
|
||||
char c = value.charAt(i);
|
||||
c = Huffman.getReplacementCharacter(c);
|
||||
c = HttpTokens.sanitizeFieldVchar(c);
|
||||
buffer.put((byte)c);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue