فبرات خط رأس HTTP و HTTP: ما الحرف المستخدم لتمثيل؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

أنا حلقات من خلال كل سطر من سلسلة من رؤوس HTTP التي تم إرجاعها، في محاولة للكشف عن نهايات واحدة وتبدأ التالي. أعلم أن رأس HTTP ينتهي بسطر فارغ، ولكن ما هو الحرف المستخدم لتمثيل هذا الخط كسر PHP؟ لقد حاولت مع \n لكن لا يبدو أن العمل. بالتأكيد يمكن أن أفعل شيئا خطأ.

ما هي الحرف المستخدم لتمثيل كسر الخط المستخدم لإنهاء رأس؟

إليك الرمز الموجود الخاص بي:

$redirect = '';
$regs = '';
foreach ($curl_response as $line)
{   
    if ($line != "\n")
    {   # line is not a linebreak, so we're still processing a header block

        if (preg_match("(HTTP/[0-9]\.[0-9] [0-9]{3} .*)",$line))
        {   # line is the status code
            # highlight the outputted line
            $output .= "<b style='background: yellow;'>$line</b>";
        }

        elseif (preg_match("/^Location: (.*)$/m",$line,$regs)) 
        {   # the line is a location header, so grab the location being redirected to
            # highlight the outputted line
            $output .= "<b style='background: purple; color: white;'>$line</b>";
            $redirect = $regs[1];
        }

        else 
        {   # some other header, record to output
            $output .= $line;
        }

    }

    else 
    {   # we've reached a line break, so we're getting to a new block of redirects
        $output .= "\nreached line break\n";
        if ($redirect != '')
        {   # if we recorded a redirect above, append it to output
            $output .= "\n\nRedirecting to $redirect\n\n";
            $redirect = '';
        }

    }   

}

echo $output;

تم حلها - تبين ذلك \r هو ما يجب أن أقوم به. غريب جدا. لست متأكدا مما إذا كان هذا التغييرات في الموقع، أو إذا كان هناك شيء محدد في حليقة. حتى الآن \r على جميع المواقع التي جربتها.

تحرير 2.: دو. أعتقد أنه لأنه من أجل الحصول على الرأس إلى صفيف من الخطوط، انفجرت ذلك \n. وبعد لذلك ربما أي \r\n الآن فقط \r...

$c = explode("\n",$content);
هل كانت مفيدة؟

المحلول

تحتاج أيضا إلى التحقق من " r n" و " r"، لأن هذه هي أيضا سارية المفعول خطوط فارغة.

عند النموذج الكنسي، استخدم الفرعية الإعلامية من النوع "النص" CRLF ككسر خط النص. يسترجح HTTP هذا الشرط ويسمح بنقل وسائط النص مع CR عادي أو LF بمفرده يمثل استراحة سطر عند الانتهاء باستمرار للحصول على جسم كولي كامل. يجب أن تقبل تطبيقات HTTP CRLF و BARE CR و BARE LF كما تمثل استراحة خط في الوسائط النصية المستلمة عبر HTTP.

-- HTTP / 1.1: معلمات البروتوكول - 3.7.1 canonicalization والنص الافتراضي

نصائح أخرى

ينتهي الرؤوس مع استراحة خط مزدوج دون مساحة بين (أي خط فارغ). يمكن أن يكون استراحة الخط إما " n"، " r n" أو مجرد " r". على الرغم من أن الأخير غير شائع، إلا أنه لا يزال يحتاج إلى حسابه.

ربما يمكنك العثور على نهاية الرؤوس مع تعبير منتظم مثل

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top