<p>تعطل request.get مع "محتوى العنوان يحتوي على أحرف غير صالحة"</p>

تم إنشاؤها على ٨ مارس ٢٠١٦  ·  20تعليقات  ·  مصدر: request/request

جرب هذا:

require('request').get('http://www.test.com/אבגד.pdf');

بعد بضعة أجزاء من الألف من الثانية ، تعطل هذا مع TypeError('The header content contains invalid characters')

الآن إذا قمت بلفها بـ encodeURI - فقد نجحت.
ولكن إذا تلقينا عناوين url من مصدر خارجي - فقد تكون أو لا تكون مشفرة. هل هناك نوع من الآليات المدمجة للتعامل مع هذا؟ (بخلاف عمل encodeURI(decodeURI(url)) )

التعليق الأكثر فائدة

الشيء هو أنه على الرغم من أنه من السهل إصلاح ذلك ، إلا أن request يجب أن يكتشف الخطأ وينشره من خلال معالجات الأخطاء. يتم طرحه حاليًا كاستثناء غير معلوم والذي يمكن أن يتسبب في أعطال خادم سيئة جدًا لا يمكنك التعافي منها أبدًا لأنه لا يمكنك محاولة / التقاط هذا يدويًا.

لذلك أقول إن هذا خطأ خطير جدًا في request . يجب نشر الخطأ.

ال 20 كومينتر

أيضًا - لم أجد طريقة للقبض على هذا الاستثناء. لا يهم إذا كان هناك محاولة ، أو .on('error', ...

أتلقى نفس الخطأ باستخدام إصدار Node 0.12.12 والإصدارات الأحدث. نفس الكود يعمل مع 0.12.9:

_http_outgoing.js:355
      throw new TypeError('The header content contains invalid characters');
            ^
TypeError: The header content contains invalid characters
    at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:355:13)
    at new ClientRequest (_http_client.js:101:14)
    at Object.exports.request (http.js:49:10)
    at Object.exports.request (https.js:136:15)
    at Request.start (//application/node_modules/request/request.js:747:30)
    at Request.end (/application/node_modules/request/request.js:1381:10)
    at end (/application/node_modules/request/request.js:575:14)
    at Immediate._onImmediate (/application/node_modules/request/request.js:589:7)
    at processImmediate [as _immediateCallback] (timers.js:367:17)

تبين أنه في حالتي كنت أرسل فاصل سطر على ملف تعريف ارتباط. كان علي إزالته.

لا ، حالتي بسيطة من سطر واحد ، ولا توجد ملفات تعريف ارتباط ، ولا رؤوس إضافية.

أحصل على نفس المشكلة ، باستخدام https://github.com/matt-major/do-wrapper عند محاولة الوصول إلى معلومات حسابي.

_http_outgoing.js:348
    throw new TypeError('The header content contains invalid characters');
    ^

TypeError: The header content contains invalid characters
    at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:348:11)
    at new ClientRequest (_http_client.js:85:14)
    at Object.exports.request (http.js:31:10)
    at Object.exports.request (https.js:197:15)
    at Request.start (/home/pierre/Documents/freelance/upwork/dosh/node_modules/do-wrapper/node_modules/request/request.js:746:30)
    at Request.write (/home/pierre/Documents/freelance/upwork/dosh/node_modules/do-wrapper/node_modules/request/request.js:1345:10)
    at end (/home/pierre/Documents/freelance/upwork/dosh/node_modules/do-wrapper/node_modules/request/request.js:560:16)
    at Immediate._onImmediate (/home/pierre/Documents/freelance/upwork/dosh/node_modules/do-wrapper/node_modules/request/request.js:588:7)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

الشيء هو أنه على الرغم من أنه من السهل إصلاح ذلك ، إلا أن request يجب أن يكتشف الخطأ وينشره من خلال معالجات الأخطاء. يتم طرحه حاليًا كاستثناء غير معلوم والذي يمكن أن يتسبب في أعطال خادم سيئة جدًا لا يمكنك التعافي منها أبدًا لأنه لا يمكنك محاولة / التقاط هذا يدويًا.

لذلك أقول إن هذا خطأ خطير جدًا في request . يجب نشر الخطأ.

لقد استثمرت ساعتين جيدًا الآن في محاولة لإصلاح هذه المشكلة ، والتي كانت كتابة حالة اختبار إعادة إنتاجها تافهة للغاية.
لقد توصلت إلى استنتاج مفاده أنه من خلال معرفتي الحالية بقاعدة الشفرة ، فإنه غير قابل للإصلاح ما لم تتم إضافة التحقق من الصحة إلى https://github.com/request/caseless ، وهو ما كلفني ما بين 20 إلى 30 دقيقة لاكتشافها في الواقع self.setHeader . لم يتم توثيق هذا السلوك في caseless ، كما أنه ليس واضحًا من الاسم أنه يتعامل مع إعداد الرؤوس والحصول عليها ، كما أنه من غير المتوقع أن يقوم caseless.httpify(self, self.headers) بإصلاح الكائن بـ setHeader .

try/catch المستحيل تقريبًا استرداد self.req.end ، وإذا تمت إزالة المكالمة ، فلن يتم تشغيل أي من السلوك التالي (مرة أخرى ، لأسباب غير واضحة تمامًا).

لكي أكون صريحًا ، فإنه يخيفني أن خدمات الإنتاج الخاصة بي تعتمد على مكتبة بها ملف رئيسي بسطر 1.4 كيلو حيث يكون المنطق معقدًا لدرجة أن شيئًا ما سهل مثل نشر خطأ من المحاولة / الالتقاط يكون مستحيلًا عمليًا دون دراسة عميقة بالكامل آلة روب غولدبرغ للأحداث. حان الوقت للابتعاد عن هذا.

يؤثر هذا أيضًا على Node 5.6.0 وما فوقه والذي يحتوي على تحقق أكثر صرامة من صحة الرأس: https://github.com/nodejs/node/blob/v5.6.0/CHANGELOG.md

ثابت هنا https://github.com/request/request/pull/2164

ألق نظرة على الاختبار الخاص بكيفية التعامل مع الخطأ في التعليمات البرمجية الخاصة بك.

يبدو أن معالجة الخطأ كالمعتاد ، مع حدث .on('error', ... . حسن!

سيؤدي هذا إلى جعل request أكثر مقاومة للرصاص ، دون تعطل التطبيق على أشياء غبية في المستقبل.

حسنًا ، الآن أشعر وكأنني وخز سخيف بشكل لا يصدق.
كان لدي في الواقع نفس الحل جاهزًا وستفشل اختباراتي باستمرار.
ظهر في "حالة الاختبار التافهة" لقد نسيت الاتصال بـ t.end() .

اعتذاري ، في المرة القادمة سوف أنشر فرعي وأطلب إبداء الرأي.

TimBeyer لا مشكلة ، تم نشر الإصدار 2.71 مع الإصلاح: +1:

simov الإصدار 2.71 قد أصلح المشكلة جزئيًا بالنسبة لي ، هذا هو السيناريو الخاص بي ، فأنا أرسل طلب نشر

request({
              method: 'POST',
              headers: {
                 'test': 'אבגד'
              },
              uri: apiUrl,
              qs: req.query,
              json: req.body,
              gzip: true
            }
            , function(error, response, body) {
               console.log('callback')
            })
            .on('response', function (response) {
             console.log(response)
            })
            .on('error', function (err) {
              console.log(err);
            });

عندما أقوم بتشغيل هذا أحصل على خطأ

return self.req.write.apply(self.req, arguments)
                 ^

TypeError: Cannot read property 'write' of undefined
    at Request.write (/Users/muhammadkhurrumqureshi/Workspace/www/node_modules/request/request.js:1385:18)
    at end (/Users/muhammadkhurrumqureshi/Workspace/www/node_modules/request/request.js:565:18)
    at Immediate._onImmediate (/Users/muhammadkhurrumqureshi/Workspace/www/node_modules/request/request.js:594:7)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

هل يمكنك التكرم بالمساعدة في هذا؟

khurrumqureshi ثابت هنا https://github.com/request/request/pull/2165 : +1:

في الأساس نفس الشيك كما في طريقة end . السبب في ذلك هو أنه تم استدعاء start في السطر السابق ، وحتى الآن لم يكن من المتوقع أن يتم طرحه. عندما يكون لطلبك جسم ، يتم استدعاء write قبل end ، ومن هنا جاء الخطأ.

@ simov : +1:

كذلك هنا.

TypeError: The header content contains invalid characters
    at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:348:11)
    at new ClientRequest (_http_client.js:85:14)
    at Object.exports.request (http.js:31:10)
    at Object.exports.request (https.js:199:15)
    at Request.start (/home/mymodule/node_modules/request/request.js:744:32)
    at Request.end (/home/mymodule/node_modules/request/request.js:1433:10)
    at end (/home/mymodule/node_modules/request/request.js:566:14)
    at Immediate.<anonymous> (/home/mymodule/node_modules/request/request.js:580:7)
    at runCallback (timers.js:570:20)
    at tryOnImmediate (timers.js:550:5)

رؤوس الاستجابة هي:

headers:
      { 'x-backside-transport': 'OK OK,FAIL FAIL',
        connection: 'close',
        'transfer-encoding': 'chunked',
        'x-dp-local-file': 'true',
        'x-client-ip': '127.0.0.1,176.31.126.162',
        'x-global-transaction-id': '145630106',
        date: 'Tue, 08 Nov 2016 01:03:59 GMT',
        'www-authenticate': 'Basic realm="Gateway(Log-in)"',
        'x-archived-client-ip': '127.0.0.1',
        'content-type': '',
        'x-dp-tran-id': 'gateway' },
     rawHeaders:
      [ 'X-Backside-Transport',
        'OK OK,FAIL FAIL',
        'Connection',
        'close',
        'Transfer-Encoding',
        'chunked',
        'x-dp-local-file',
        'true',
        'X-Client-IP',
        '127.0.0.1,176.31.126.162',
        'X-Global-Transaction-ID',
        '145630106',
        'Date',
        'Tue, 08 Nov 2016 01:03:59 GMT',
        'WWW-Authenticate',
        'Basic realm="Gateway(Log-in)"',
        'X-Archived-Client-IP',
        '127.0.0.1',
        'Content-Type',
        '',
        'X-DP-Watson-Tran-ID',
        'gateway' ]

رؤوس الطلب هي:

{ accept: 'application/json',
     authorization: 'Basic ...g==',
     referer: 'https://hostname.com/classify?text=%20So%20happy%20with%20this%20👍👍👍👍👍',
     host: 'gateway.myclass.net' }

كما ترى يحتوي الطلب 3 مرات على حرف خاص <U+1F44D> .

هل يمكن أن تكون هذه هي المشكلة؟

يبدو أن الوحدة النمطية node.js https لا تدعمها.

فقط في حالة تعرض شخص آخر لنفس المشكلة كما فعلت - كان لدي هذا الخطأ مع aws-sdk وكان يقودني إلى الجنون لساعات. تبين أنه حرف PrvScan \u001b[5~ كان مختبئًا لسبب ما في ملف ~/.aws/credentials ، والذي تم نشره في رأس التفويض الذي تستخدمه طلبات AWS. ظهر الخطأ فقط على جهاز Windows 7 الخاص بي ، لذلك ربما كان شيئًا يتعلق بكيفية استرداد ملف بيانات الاعتماد من حساب AWS الخاص بي وبعض ترميز أحرف Windows. لم يكن مرئيًا عند cat ing ملف بيانات الاعتماد أيضًا ، ولكنه أصبح مرئيًا بمجرد فتح الملف باستخدام vi .

نعم ، كان لدي نفس المشكلة. استغرق مني بضع ساعات لمعرفة ذلك يجب أن أعترف.
كان يستخدم MINGW64 (Git Bash) على جهاز windows. حاولت تشغيل نفس البرنامج النصي باستخدام Node في موجه الأوامر .... ومرحبا .... عملت ؟؟؟؟

لقد أصبت بنفس الخطأ للتو ولم أجد طريقة للقبض عليه. أنا أقوم بإنشاء وكيل للصورة ، لذا لا يمكنني التحكم في ما سيعيده الخادم الآخر. كيف يمكنني تجنب تعطل الخادم بأكمله في الإنتاج ؟!

كانت لدي نفس المشكلة ، وبدأت في العمل عندما استبدلت "المجموعة" بـ "المصادقة". على سبيل المثال:

it('ERROR, Wrong GET request', (done)=>{
    request(server).get("/api/")
    .set('Authorization', 'Bearer ' + tokenKey)
    .then(res=>{
        expect(res.statusCode).to.equal(404);
        done()
    }).catch(err=>done(err))
})

RES CONSOLE RES: خطأ ، طلب GET خاطئ:
خطأ في النوع [ERR_INVALID_CHAR]: حرف غير صالح في محتوى الرأس ["التخويل"]

بعد تغيير الكود إلى:

it('ERROR, Wrong GET request', (done)=>{
    request(server).get("/api/")
    .auth('Authorization', 'Bearer ' + tokenKey) //**<---here is the change**
    .then(res=>{
        expect(res.statusCode).to.equal(404);
        done()
    }).catch(err=>done(err))
})

CONSOLE RES: OKI ؛ ص

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات