الترميز المقسم التنفيذ .صافي (أو على الأقل البرمجية الزائفة)
-
11-07-2019 - |
سؤال
كتبت الخام 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