2008-11-25 2 views
3

Я написал необработанный TCP-клиент для HTTP/HTTPS-запросов, однако у меня возникают проблемы с чередующимися ответами на кодирование. HTTP/1.1 - это требование, поэтому я должен его поддерживать.Внедрение кодированного кодирования в .NET (или, по крайней мере, псевдокод)

Raw TCP является требованием бизнеса, что мне нужно держать, поэтому я не могу переключиться на .NET HTTPWebRequest/HttpWebResponse Однако, если есть способ конвертировать RAW HTTP запрос/ответ в HTTPWebRequest/HttpWebResponse, что бы Работа.

ответ

5

Лучшее место для начала - http 1.1 specification, в котором описывается, как работает блок. В частности, раздел 3.6.1.

3.6.1 поблочное Кодирование

фрагментированное кодирование изменяет тела сообщения для того, чтобы
передачи его в виде ряда кусков, каждой со своим собственным индикатором размера, а затем
с помощью ДОПОЛНИТЕЛЬНОГО трейлера , содержащего поля заголовка объекта. Это позволяет динамически создаваемому содержимому быть переданы вместе с
информации, необходимой для получателя , чтобы убедиться, что он имеет
получил полное сообщение.

Chunked-Body = *chunk 
        last-chunk 
        trailer 
        CRLF 

    chunk   = chunk-size [ chunk-extension ] CRLF 
        chunk-data CRLF 
    chunk-size  = 1*HEX 
    last-chunk  = 1*("0") [ chunk-extension ] CRLF 

    chunk-extension= *(";" chunk-ext-name [ "=" chunk-ext-val ]) 
    chunk-ext-name = token 
    chunk-ext-val = token | quoted-string 
    chunk-data  = chunk-size(OCTET) 
    trailer  = *(entity-header CRLF) 

Поле размера куска является строкой шестнадцатеричных цифр, указывающего размером
фрагмента. Кодовое кодирование - , которое заканчивается любым фрагментом, размер которого равен
ноль, за которым следует трейлер, который заканчивается пустой линией.

Прицеп позволяет отправителю включать дополнительный HTTP-заголовок
полей в конце сообщения. Поле заголовка трейлера может использоваться для . Укажите, какие поля заголовка включены в трейлер (см. Раздел 14.40).

Предполагая, что вы уже прочитали заголовок из ответа и указывают на следующий байт в потоке ваш псевдо-код будет выглядеть примерно так:

done = false; 
uint8 bytes[]; 
while (!done) 
{ 
    chunksizeString = readuntilCRLF(); // read in the chunksize as a string 
    chunksizeString.strip(); // strip off the CRLF 
    chunksize = chunksizeString.convertHexString2Int(); // convert the hex string to an integer. 
    bytes.append(readXBytes(chunksize)); // read in the x bytes and append them to your buffer. 
    readCRLF(); // read the trailing CRLF and throw it away. 
    if (chunksize == 0) 
    done = true; // 

} 
// now read the trailer if any 
// trailer is optional, so it may be just the empty string 
trailer = readuntilCRLF() 
trailer = trailer.strip() 
if (trailer != "") 
    readCRLF(); // read out the last CRLF and we are done. 

Это игнорируя чанка-расширение но поскольку он разделен символом ";" его легко разбить. Этого должно быть достаточно, чтобы вы начали. Имейте в виду, что строка chunksize не имеет ведущий «0x».

+0

еще раз спасибо, теперь он работает просто отлично. –

1

Для дальнейшего использования также я нашел это:

length := 0 
    read chunk-size, chunk-extension (if any) and CRLF 
    while (chunk-size > 0) { 
     read chunk-data and CRLF 
     append chunk-data to entity-body 
     length := length + chunk-size 
     read chunk-size and CRLF 
    } 
    read entity-header 
    while (entity-header not empty) { 
     append entity-header to existing header fields 
     read entity-header 
    } 
    Content-Length := length 
    Remove "chunked" from Transfer-Encoding 
Смежные вопросы