Как закодировать пользовательские заголовки HTTP в С#

Существует ли класс, подобный HttpUtility, для кодирования содержимого пользовательского заголовка? В идеале я хотел бы, чтобы содержимое было читаемым.

Ответ 1

Вы можете использовать HttpEncoder.HeaderNameValueEncode Method в .NET Framework 4.0 и выше.

Для предыдущих версий .NET Framework вы можете свернуть собственный кодер, используя логику, указанную на странице справки HttpEncoder.HeaderNameValueEncode:

  • Все символы, значение Unicode которых меньше ASCII-символа 32, кроме символа ASCII 9, кодируются URL-адресами в формате% NN, где N символов представляют шестнадцатеричные значения.

  • Символ ASCII 9 (символ горизонтальной вкладки) не кодируется URL.

  • Символ ASCII 127 кодируется как% 7F.

  • Все остальные символы не закодированы.

Update:

Как указывает OliverBock, метод HttpEncoder.HeaderNameValueEncode защищен и внутренне. Я пошел в проект с открытым исходным кодом Mono и нашел моно-реализацию

void HeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue)
{
        if (String.IsNullOrEmpty (headerName))
                encodedHeaderName = headerName;
        else
                encodedHeaderName = EncodeHeaderString (headerName);

        if (String.IsNullOrEmpty (headerValue))
                encodedHeaderValue = headerValue;
        else
                encodedHeaderValue = EncodeHeaderString (headerValue);
}

static void StringBuilderAppend (string s, ref StringBuilder sb)
{
        if (sb == null)
                sb = new StringBuilder (s);
        else
                sb.Append (s);
}

static string EncodeHeaderString (string input)
{
        StringBuilder sb = null;

        for (int i = 0; i < input.Length; i++) {
                char ch = input [i];

                if ((ch < 32 && ch != 9) || ch == 127)
                        StringBuilderAppend (String.Format ("%{0:x2}", (int)ch), ref sb);
        }

        if (sb != null)
                return sb.ToString ();

        return input;
}

Просто FYI

[здесь] (https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web.Util/HttpEncoder.cs)

Ответ 2

Мне помогли Uri.EscapeDataString(headervalue)

Ответ 3

Выполняет то же самое задание, что и HeaderNameValueEncode(), но также кодирует символы%, поэтому заголовок может быть надежно декодирован позже.

static string EncodeHeaderValue(string value)
{
    return Regex.Replace(value, @"[\u0000-\u0008\u000a-\u001f%\u007f]", (m) => "%"+((int)m.Value[0]).ToString("x2"));
}

static string DecodeHeaderValue(string encoded)
{
    return Regex.Replace(encoded, @"%([0-9a-f]{2})", (m) => new String((char)Convert.ToInt32(m.Groups[1].Value, 16), 1), RegexOptions.IgnoreCase);
}

Ответ 5

извините его за верхнюю часть моей головы, но для вашего объекта запроса должен быть объект заголовков, который вы можете добавить.

то есть. request.headers.add( "бла" );

Thats not spot on, но он должен указывать на вас в правильном направлении.