الترميز المقسم التنفيذ .صافي (أو على الأقل البرمجية الزائفة)

StackOverflow https://stackoverflow.com/questions/318489

سؤال

كتبت الخام TCP عميل HTTP/HTTPS الطلبات ، ومع ذلك أواجه مشاكل مع الترميز المقسم الردود.HTTP/1.1 هو الشرط ولذلك يجب أن يعتمد عليه.

الخام TCP هو شرط الأعمال التي تحتاج إلى الاحتفاظ بها ، لذلك أنا لا يمكن أن تتحول إلى .صافي HTTPWebRequest/HTTPWebResponse ومع ذلك إذا كان هناك طريقة لتحويل الخام HTTP طلب/الاستجابة في HTTPWebRequest/HTTPWebResponse هذا العمل.

هل كانت مفيدة؟

المحلول

أفضل مكان للبدء هو مواصفات http 1.1, الذي يحدد كيف chunking يعمل.وتحديدا القسم 3.6.1.

3.6.1 نقل المقسم الترميز

فإن الترميز المقسم يعدل نص رسالة من أجل
نقل على أنها سلسلة من قطع ، ولكل منها حجم المؤشر ،
تليها اختياري trailer التي تحتوي على حقول رأس الكيان.هذا يسمح حيوي إنتاج المحتوى نقل جنبا إلى جنب مع
المعلومات اللازمة المتلقي للتحقق من أنه قد
تلقى الرسالة كاملة.

   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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top