Monday 13 November 2017

Opções Binárias De Multipart Content-Transfer-Encoding


Estou escrevendo um servidor web simples em python que permite ao usuário carregar um arquivo usando multipart / form-data. Tanto quanto eu posso dizer, multipart MIME dados é suposto ser linha baseada. Por exemplo, o limite tem de estar no início de uma linha. Eu não consigo descobrir como os dados binários são tratados a este respeito. Meu cliente (Firefox) não está codificando em 7 bits ASCII ou qualquer coisa, seus dados binários apenas raw seu envio. Será que dividir os dados em linhas em locais arbitrários Existe um comprimento de linha máximo especificado para dados de várias partes Ive tentou olhar através do RFC para multipart / form-data, mas não encontrou nada. Perguntou Mar 27 13 at 16:54 Depois de cavar através dos RFCs, acho que finalmente consegui tudo direto na minha cabeça. As partes do corpo (isto é, o conteúdo corporal de uma parte individual numa mensagem / multipart) apenas precisam de ser baseadas em linhas, uma vez que o limite no final da parte começa com um CRLF. Mas, caso contrário, os dados não precisam ser baseados em linha, e se o conteúdo acontece com linebreaks nele, não há distância máxima entre eles, nem eles precisam ser escapados de qualquer maneira (bem, a menos que talvez o Content-Transfer - A codificação é quoted-string). As opções de 7 bits, 8 bits e binárias para Content-Transfer-Encoding não indicam realmente que qualquer codificação foi feita nos dados (e, portanto, nenhuma codificação precisa ser desfeita), eles significam apenas para indicar o tipo de dados Você pode esperar para ver na parte do corpo. O que eu estava realmente começando em minha pergunta mal expressa era como ler / buffer os dados do soquete para que eu pudesse ter certeza que eu peguei o limite, e sem ter que ter um buffer arbitrariamente grande (por exemplo, se aconteceu de ser não Linebreaks no conteúdo, e assim um readline acabou buffering a coisa toda). O que eu acabei fazendo foi buffer do soquete com um readline usando um comprimento máximo, então o buffer nunca seria mais longo do que isso, mas também iria certificar-se de terminar se um linebreak foi encontrado. Isso garantiu que quando o limite veio (após um CRLF), seria no início do buffer. Eu tive que fazer um pouco de monkeying extra ao redor para garantir que eu não incluíram que CRLF final no conteúdo real do corpo, porque de acordo com o RFC é necessário antes da fronteira e, portanto, não parte do conteúdo em si. Resposta Tente rever o RFC 2045. Normalmente, o conteúdo binário é convertido em BASE64 pela sua aplicação e incluído na mensagem de várias partes usando Content-Transfer-Encoding. Base64. Existem outros mecanismos para transferir dados binários, mas isso é bastante comum. Os dados binários são convertidos em octetos e fragmentados em cadeias de comprimento arbitrárias (dependendo da variante de codificação - veja o link BASE64 acima). O aplicativo receptor, em seguida, decodifica-lo para o conteúdo binário original. Eu não sou um programador python, mas eu ficaria surpreso que você realmente tinha que codificar qualquer um deste você mesmo. Eu suspeito que existem funções pré-construídas da biblioteca python para fazer isso por você. Respondeu Mar 27 13 at 17:43 Obrigado, eu estava olhando para um RFC diferente que não foi tão informativo. Eu também encontrei RFC 2046 que especificamente define multi-part mensagens na seção 5. Nota there39s um pouco de uma sutileza nestes RFCs que através de mim off: ele diz multipart mensagens não podem ter outras codificações de 7 bits, 8 bits e binário (Ie não Base-64). No entanto, ele continua a dizer que as partes individuais dentro da multi peça pode ter lá próprias codificações de conteúdo, então você está correto que Base-64 é possível. Ndash brianmearns Mar 28 13 em 13:20 Sua resposta 2016 Stack Exchange, Inc

No comments:

Post a Comment