que - Implementación de codificación fragmentada en.NET(o al menos pseudo código)
pseudocodigo pdf (2)
Escribí un cliente TCP crudo para solicitudes HTTP / HTTPS, sin embargo, tengo problemas con las respuestas de codificación fragmentadas. HTTP / 1.1 es un requisito, por lo tanto, debería apoyarlo.
TCP sin formato es un requisito de negocio que debo mantener, por lo tanto, no puedo cambiar a .NET HTTPWebRequest / HTTPWebResponse. Sin embargo, si hay forma de convertir una solicitud / respuesta HTTP sin procesar en HTTPWebRequest / HTTPWebResponse, eso funcionaría.
El mejor lugar para comenzar es la especificación http 1.1 , que explica cómo funciona la fragmentación. Específicamente la sección 3.6.1.
3.6.1 Codificación de transferencia fragmentada
La codificación fragmentada modifica el cuerpo de un mensaje para
transferirlo como una serie de trozos, cada uno con su propio indicador de tamaño,
seguido por un trailer OPCIONAL que contiene campos de encabezado de entidad. Esto permite que el contenido generado dinámicamente se transfiera junto con el
información necesaria para que el destinatario verifique que tiene
recibió el mensaje completo.
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)
El campo de tamaño de fragmento es una cadena de dígitos hexadecimales que indican el tamaño de
el pedazo La codificación fragmentada termina con cualquier fragmento cuyo tamaño sea
cero, seguido del remolque, que termina con una línea vacía.El avance permite al emisor incluir encabezado HTTP adicional
campos al final del mensaje. El campo del encabezado del tráiler se puede usar para indicar qué campos del encabezado se incluyen en un avance (consulte la sección 14.40).
Suponiendo que ya ha leído el encabezado de la respuesta y está apuntando al siguiente byte en la transmisión, su pseudo código se verá más o menos así:
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.
Esto está ignorando la porción de extensión de fragmento, pero dado que está delimitada con un ";" debería ser fácil dividirlo. Esto debería ser suficiente para comenzar. Tenga en cuenta que la cadena chunksize no tiene un "0x" inicial.
Para la futura referencia también encontré esto:
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