Package org.apache.commons.codec.net
Class PercentCodec
java.lang.Object
org.apache.commons.codec.net.PercentCodec
- All Implemented Interfaces:
BinaryDecoder
,BinaryEncoder
,Decoder
,Encoder
Implements the Percent-Encoding scheme, as described in HTTP 1.1 specification. For extensibility, an array of
special US-ASCII characters can be specified in order to perform proper URI encoding for the different parts
of the URI.
This class is immutable. It is also thread-safe besides using BitSet which is not thread-safe, but its public interface only call the access
- Since:
- 1.12
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BitSet
The bit set used to store the character that should be always encodedprivate int
The minimum and maximum code of the bytes that is inserted in the bit set, used to prevent look-upsprivate int
The minimum and maximum code of the bytes that is inserted in the bit set, used to prevent look-upsprivate static final byte
The escape character used by the Percent-Encoding in order to introduce an encoded character.private final boolean
The flag defining if the space character should be encoded as '+' -
Constructor Summary
ConstructorsConstructorDescriptionConstructs a Percent coded that will encode all the non US-ASCII characters using the Percent-Encoding while it will not encode all the US-ASCII characters, except for character '%' that is used as escape character for Percent-Encoding.PercentCodec
(byte[] alwaysEncodeChars, boolean plusForSpace) Constructs a Percent codec by specifying the characters that belong to US-ASCII that should always be encoded. -
Method Summary
Modifier and TypeMethodDescriptionprivate boolean
canEncode
(byte c) private boolean
containsSpace
(byte[] bytes) byte[]
decode
(byte[] bytes) Decode bytes encoded with Percent-Encoding based on RFC 3986.Decodes a byte[] Object, whose bytes are encoded with Percent-Encoding.private byte[]
doEncode
(byte[] bytes, int expectedLength, boolean willEncode) byte[]
encode
(byte[] bytes) Percent-Encoding based on RFC 3986.Encodes an object into using the Percent-Encoding.private int
expectedDecodingBytes
(byte[] bytes) private int
expectedEncodingBytes
(byte[] bytes) private boolean
inAlwaysEncodeCharsRange
(byte c) private void
insertAlwaysEncodeChar
(byte b) Inserts a single character into a BitSet and maintains the min and max of the characters of theBitSet alwaysEncodeChars
in order to avoid look-ups when a byte is out of this range.private void
insertAlwaysEncodeChars
(byte[] alwaysEncodeCharsArray) Adds the byte array into a BitSet for faster lookupprivate boolean
isAsciiChar
(byte c)
-
Field Details
-
ESCAPE_CHAR
private static final byte ESCAPE_CHARThe escape character used by the Percent-Encoding in order to introduce an encoded character.- See Also:
-
alwaysEncodeChars
The bit set used to store the character that should be always encoded -
plusForSpace
private final boolean plusForSpaceThe flag defining if the space character should be encoded as '+' -
alwaysEncodeCharsMin
private int alwaysEncodeCharsMinThe minimum and maximum code of the bytes that is inserted in the bit set, used to prevent look-ups -
alwaysEncodeCharsMax
private int alwaysEncodeCharsMaxThe minimum and maximum code of the bytes that is inserted in the bit set, used to prevent look-ups
-
-
Constructor Details
-
PercentCodec
public PercentCodec()Constructs a Percent coded that will encode all the non US-ASCII characters using the Percent-Encoding while it will not encode all the US-ASCII characters, except for character '%' that is used as escape character for Percent-Encoding. -
PercentCodec
public PercentCodec(byte[] alwaysEncodeChars, boolean plusForSpace) Constructs a Percent codec by specifying the characters that belong to US-ASCII that should always be encoded. The rest US-ASCII characters will not be encoded, except for character '%' that is used as escape character for Percent-Encoding.- Parameters:
alwaysEncodeChars
- the unsafe characters that should always be encodedplusForSpace
- the flag defining if the space character should be encoded as '+'
-
-
Method Details
-
insertAlwaysEncodeChars
private void insertAlwaysEncodeChars(byte[] alwaysEncodeCharsArray) Adds the byte array into a BitSet for faster lookup- Parameters:
alwaysEncodeCharsArray
-
-
insertAlwaysEncodeChar
private void insertAlwaysEncodeChar(byte b) Inserts a single character into a BitSet and maintains the min and max of the characters of theBitSet alwaysEncodeChars
in order to avoid look-ups when a byte is out of this range.- Parameters:
b
- the byte that is candidate for min and max limit
-
encode
Percent-Encoding based on RFC 3986. The non US-ASCII characters are encoded, as well as the US-ASCII characters that are configured to be always encoded.- Specified by:
encode
in interfaceBinaryEncoder
- Parameters:
bytes
- Data to be encoded- Returns:
- A byte array containing the encoded data
- Throws:
EncoderException
- thrown if the Encoder encounters a failure condition during the encoding process.
-
doEncode
private byte[] doEncode(byte[] bytes, int expectedLength, boolean willEncode) -
expectedEncodingBytes
private int expectedEncodingBytes(byte[] bytes) -
containsSpace
private boolean containsSpace(byte[] bytes) -
canEncode
private boolean canEncode(byte c) -
inAlwaysEncodeCharsRange
private boolean inAlwaysEncodeCharsRange(byte c) -
isAsciiChar
private boolean isAsciiChar(byte c) -
decode
Decode bytes encoded with Percent-Encoding based on RFC 3986. The reverse process is performed in order to decode the encoded characters to Unicode.- Specified by:
decode
in interfaceBinaryDecoder
- Parameters:
bytes
- A byte array which has been encoded with the appropriate encoder- Returns:
- a byte array that contains decoded content
- Throws:
DecoderException
- A decoder exception is thrown if a Decoder encounters a failure condition during the decode process.
-
expectedDecodingBytes
private int expectedDecodingBytes(byte[] bytes) -
encode
Encodes an object into using the Percent-Encoding. Only byte[] objects are accepted.- Specified by:
encode
in interfaceEncoder
- Parameters:
obj
- the object to encode- Returns:
- the encoding result byte[] as Object
- Throws:
EncoderException
- if the object is not a byte array
-
decode
Decodes a byte[] Object, whose bytes are encoded with Percent-Encoding.- Specified by:
decode
in interfaceDecoder
- Parameters:
obj
- the object to decode- Returns:
- the decoding result byte[] as Object
- Throws:
DecoderException
- if the object is not a byte array
-