سؤال

أبحث عن القليل من المساعدة ، لقد كتبت حاليًا خادم HTTP. انها تعامل حاليا الحصول على طلبات جيدة. ومع ذلك ، في حين يبدو أن استخدام القارئ المخزّن معلق. عندما يتم إيقاف الطلب ، تتم قراءة بقية دفق الإدخال عبر القارئ المخزن مؤقتًا. لقد وجدت بعض الأشياء على Google. لقد حاولت تغيير CRLF وإصدار البروتوكول من 1.1 إلى 1.0 (المتصفحات تلقائيًا تقدم الطلبات كـ 1.1) سيتم تقدير أي أفكار أو مساعدة. شكرًا

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

المحلول 3

هذا غير آمن! ولكن يوضح كيفية الحصول على بيانات النشر أثناء دفق الإدخال بعد رؤوس HTTP الأولية.

يعمل هذا أيضًا أيضًا على بيانات النشر القادمة على أنها "مثال = صواب وباد = خطأ" إلخ. إلخ. إلخ.

private HashMap hashMap = new HashMap();
private StringBuffer buff = new StringBuffer();
private int c = 0;
private String[] post;    public PostInputStream(InputStream in) {

    try {
        //Initalizes avaliable buff
        if (in.available() != 0) {
            this.buff.appendCodePoint((this.c = in.read()));
            while (0 != in.available()) {
                //Console.output(buff.toString());
                buff.appendCodePoint((this.c = in.read()));
            }

            this.post = buff.toString().split("&");

            for (int i = 0; i < this.post.length; i++) {
                String[] n = this.post[i].split("=");
                if (n.length == 2) {
                    hashMap.put(URLDecoder.decode(n[0], "UTF-8"), URLDecoder.decode(n[1], "UTF-8"));
                } else {
                    Console.error("Malformed Post Request.");
                }
            }
        } else {
            Console.error("No POST Data");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

نصائح أخرى

وأنا أتفق مع هانز على أنه يجب عليك استخدام مكتبة قياسية واختبارها جيدًا للقيام بذلك. ومع ذلك ، إذا كنت تكتب خادمًا للتعرف على HTTP ، فإليك بعض المعلومات حول القيام بما تريد القيام به.

لا يمكنك حقًا استخدام A Bufferreader لأنه يخزن المدخلات وقد يقرأ الكثير من البايتات من المقبس. لهذا السبب معلق الكود الخاص بك ، يحاول Bufferreadermer قراءة بايت أكثر مما هو متاح على المقبس (نظرًا لأن بيانات المنشور لا تحتوي على نهاية الخط) ، وهي تنتظر المزيد من البايتات (والتي لن تكون متوفرة أبدًا) .

العملية لتحليل طلب النشر ببساطة هي استخدام inputstream مباشرة

  • لكل سطر في الرأس اقرأ بايت في وقت واحد حتى تحصل على " r" ثم " n"

  • ابحث عن سطر يبدأ بـ "طول المحتوى:" ، استخرج الرقم في نهاية هذا السطر.

  • عندما تحصل على خط رأس فارغ ، تنتهي من الرؤوس.

  • اقرأ الآن بالضبط رقم # البايتات التي جاءت من رأس طول المحتوى.

الآن يمكنك كتابة ردك.

لن أكتب تنفيذي. انظر إلى المكونات الموجودة التالية ، إذا كنت تريد:

كما قال KaroroBerts عليك التحقق من طول المحتوى المرسلة في المنشور. ولكن لا يزال بإمكانك استخدام Bufferreader.

فقط عليك التحقق من رأس طول المحتوى لحجمه وبعد الانتهاء من قراءة جميع الرؤوس ، يمكنك تعيين مجموعة Char من هذا الحجم وجعل قراءة محتوى المنشور:

char [] buffer = new char [contentLength] ؛ request.Read (Buffer) ؛

حيث الطلب هو المخزن المؤقت. إذا كنت بحاجة إلى محتوى النشر في سلسلة ، فيمكنك استخدام: string.valueof (Buffer) ؛

ملاحظة: يقوم BufferedReader.Read بإرجاع int من الأحرف التي تم قراءتها ، بحيث يمكنك التحقق من هناك للتناقضات مع رأس طول المحتوى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top