All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.ipokerface.weixin.request.http.HeaderValueFormatter Maven / Gradle / Ivy

There is a newer version: 1.5.0
Show newest version
package cn.ipokerface.weixin.request.http;

import cn.ipokerface.weixin.io.CharArrayBuffer;

/**
 * Created by       PokerFace
 * Create Date      2019-12-27.
 * Email:           [email protected]
 * Version          1.0.0
 * 

* Description: */ public class HeaderValueFormatter { public final static HeaderValueFormatter INSTANCE = new HeaderValueFormatter(); /** * Special characters that can be used as separators in HTTP parameters. * These special characters MUST be in a quoted string to be used within * a parameter value . */ public final static String SEPARATORS = " ;,:@()<>\\\"/[]?={}\t"; /** * Unsafe special characters that must be escaped using the backslash * character */ public final static String UNSAFE_CHARS = "\"\\"; public HeaderValueFormatter() { super(); } /** * Formats a set of parameters. * * @param nvps the parameters to format * @param quote true to always format with quoted values, * false to use quotes only when necessary * @param formatter the formatter to use, or null * for the {@link #INSTANCE default} * * @return the formatted parameters */ public static String formatParameters(final NameValue[] nvps, final boolean quote, final HeaderValueFormatter formatter) { return (formatter != null ? formatter : HeaderValueFormatter.INSTANCE) .formatParameters(null, nvps, quote).toString(); } // non-javadoc, see interface HeaderValueFormatter public CharArrayBuffer formatParameters(final CharArrayBuffer charBuffer, final NameValue[] nvps, final boolean quote) { final int len = estimateParametersLen(nvps); CharArrayBuffer buffer = charBuffer; if (buffer == null) { buffer = new CharArrayBuffer(len); } else { buffer.ensureCapacity(len); } for (int i = 0; i < nvps.length; i++) { if (i > 0) { buffer.append("; "); } formatNameValuePair(buffer, nvps[i], quote); } return buffer; } /** * Estimates the length of formatted parameters. * * @param nvps the parameters to format, or null * * @return a length estimate, in number of characters */ protected int estimateParametersLen(final NameValue[] nvps) { if ((nvps == null) || (nvps.length < 1)) { return 0; } int result = (nvps.length-1) * 2; // "; " between the parameters for (final NameValue nvp : nvps) { result += estimateNameValuePairLen(nvp); } return result; } /** * Formats a name-value pair. * * @param nvp the name-value pair to format * @param quote true to always format with a quoted value, * false to use quotes only when necessary * @param formatter the formatter to use, or null * for the {@link #INSTANCE default} * * @return the formatted name-value pair */ public static String formatNameValuePair(final NameValue nvp, final boolean quote, final HeaderValueFormatter formatter) { return (formatter != null ? formatter : HeaderValueFormatter.INSTANCE) .formatNameValuePair(null, nvp, quote).toString(); } // non-javadoc, see interface HeaderValueFormatter public CharArrayBuffer formatNameValuePair(final CharArrayBuffer charBuffer, final NameValue nvp, final boolean quote) { final int len = estimateNameValuePairLen(nvp); CharArrayBuffer buffer = charBuffer; if (buffer == null) { buffer = new CharArrayBuffer(len); } else { buffer.ensureCapacity(len); } buffer.append(nvp.getName()); final String value = nvp.getValue(); if (value != null) { buffer.append('='); doFormatValue(buffer, value, quote); } return buffer; } /** * Estimates the length of a formatted name-value pair. * * @param nvp the name-value pair to format, or null * * @return a length estimate, in number of characters */ protected int estimateNameValuePairLen(final NameValue nvp) { if (nvp == null) { return 0; } int result = nvp.getName().length(); // name final String value = nvp.getValue(); if (value != null) { // assume quotes, but no escaped characters result += 3 + value.length(); // ="value" } return result; } /** * Actually formats the value of a name-value pair. * This does not include a leading = character. * Called from {@link #formatNameValuePair formatNameValuePair}. * * @param buffer the buffer to append to, never null * @param value the value to append, never null * @param quote true to always format with quotes, * false to use quotes only when necessary */ protected void doFormatValue(final CharArrayBuffer buffer, final String value, final boolean quote) { boolean quoteFlag = quote; if (!quoteFlag) { for (int i = 0; (i < value.length()) && !quoteFlag; i++) { quoteFlag = isSeparator(value.charAt(i)); } } if (quoteFlag) { buffer.append('"'); } for (int i = 0; i < value.length(); i++) { final char ch = value.charAt(i); if (isUnsafe(ch)) { buffer.append('\\'); } buffer.append(ch); } if (quoteFlag) { buffer.append('"'); } } /** * Checks whether a character is a {@link #SEPARATORS separator}. * * @param ch the character to check * * @return true if the character is a separator, * false otherwise */ protected boolean isSeparator(final char ch) { return SEPARATORS.indexOf(ch) >= 0; } /** * Checks whether a character is {@link #UNSAFE_CHARS unsafe}. * * @param ch the character to check * * @return true if the character is unsafe, * false otherwise */ protected boolean isUnsafe(final char ch) { return UNSAFE_CHARS.indexOf(ch) >= 0; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy