.net - एनके(या कम से कम छद्म कोड) में चोंच किया गया एन्कोडिंग कार्यान्वयन




http encoding (2)

मैंने HTTP / HTTPS अनुरोधों के लिए एक कच्चे टीसीपी ग्राहक लिखा था, हालांकि मुझे चंकेड एन्कोडिंग प्रतिक्रियाओं में समस्याएं आ रही हैं I HTTP / 1.1 की आवश्यकता इसलिए मुझे इसका समर्थन करना चाहिए।

रॉ टीसीपी एक व्यवसाय की आवश्यकता है जो मुझे रखने की आवश्यकता है, इसलिए मैं .NET HTTPWebRequest / HTTPWebResponse पर स्विच नहीं कर सकता है, हालांकि यदि एक रॉ HTTP अनुरोध / प्रतिक्रिया HTTPWebRequest / HTTPWebResponse में परिवर्तित करने का तरीका है जो काम करेगा।


शुरू करने के लिए सबसे अच्छी जगह है 1.1 1.1 विनिर्देश , जो बताता है कि कैसे काम करता है चंकींग विशेष रूप से खंड 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" नहीं है


भविष्य के संदर्भ के लिए मुझे यह भी मिला:

 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




chunked-encoding