<p>request.get lumpuh dengan "Konten header berisi karakter yang tidak valid"</p>

Dibuat pada 8 Mar 2016  ·  20Komentar  ·  Sumber: request/request

Coba ini:

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

Setelah beberapa milidetik, ini macet dengan TypeError('The header content contains invalid characters')

Sekarang jika saya membungkusnya dengan encodeURI - berhasil.
Tetapi jika kami menerima url dari sumber eksternal - mereka mungkin atau mungkin tidak dikodekan. Apakah ada semacam mekanisme bawaan untuk menangani ini? (Selain melakukan encodeURI(decodeURI(url)) )

Komentar yang paling membantu

Masalahnya, meskipun mudah untuk memperbaikinya, request harus menangkap kesalahan dan menyebarkannya melalui penangan kesalahan. Saat ini dilemparkan sebagai pengecualian yang tidak tertangkap yang dapat menyebabkan server crash yang sangat buruk yang tidak dapat Anda pulihkan karena Anda tidak dapat mencoba/menangkap ini secara manual.

Jadi saya akan mengatakan ini adalah bug yang cukup parah di request . Kesalahan perlu disebarkan.

Semua 20 komentar

Juga - saya tidak menemukan cara untuk menangkap pengecualian itu. Tidak masalah jika ada try-catch, atau .on('error', ...

Saya mendapatkan kesalahan yang sama menggunakan Node versi 0.12.12 dan lebih tinggi. Kode yang sama bekerja dengan 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)

Ternyata dalam kasus saya, saya mengirim jeda baris pada cookie. Aku harus menghapusnya.

Tidak, kasing saya sederhana, tanpa cookie, tanpa header tambahan.

Saya mendapatkan masalah yang sama, menggunakan https://github.com/matt-major/do-wrapper ketika mencoba mengakses informasi akun saya.

_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)

Masalahnya, meskipun mudah untuk memperbaikinya, request harus menangkap kesalahan dan menyebarkannya melalui penangan kesalahan. Saat ini dilemparkan sebagai pengecualian yang tidak tertangkap yang dapat menyebabkan server crash yang sangat buruk yang tidak dapat Anda pulihkan karena Anda tidak dapat mencoba/menangkap ini secara manual.

Jadi saya akan mengatakan ini adalah bug yang cukup parah di request . Kesalahan perlu disebarkan.

Saya telah menginvestasikan 2 jam yang baik sekarang mencoba untuk memperbaiki masalah ini, yang menulis kasus uji reproduksi cukup sepele.
Saya sampai pada kesimpulan bahwa dengan pengetahuan saya saat ini tentang basis kode, itu tidak dapat diperbaiki kecuali validasi akan ditambahkan ke https://github.com/request/caseless , yang menghabiskan waktu 20-30 menit untuk menemukan sebenarnya self.setHeader . Perilaku itu tidak didokumentasikan pada caseless , juga tidak jelas dari namanya yang berhubungan dengan pengaturan dan mendapatkan header, dan juga tidak diharapkan bahwa caseless.httpify(self, self.headers) akan menambal objek dengan setHeader .

try/catch pada titik di mana objek permintaan dibuat hampir tidak mungkin untuk dipulihkan karena tidak ada cara sederhana untuk membatalkan eksekusi. self.req.end akan tetap dipanggil, dan jika panggilan dihapus, tidak ada perilaku berikutnya yang dipicu (sekali lagi, untuk alasan yang sama sekali tidak jelas).

Terus terang, saya takut bahwa layanan produksi saya bergantung pada perpustakaan dengan file utama 1.4k baris di mana logikanya sangat berbelit-belit sehingga sesuatu yang semudah menyebarkan kesalahan dari coba/tangkap praktis tidak mungkin tanpa mempelajari keseluruhan secara mendalam mesin acara rube goldberg. Saatnya menjauh dari ini.

Ini juga memengaruhi Node 5.6.0 dan di atasnya yang memiliki validasi tajuk yang lebih ketat: https://github.com/nodejs/node/blob/v5.6.0/CHANGELOG.md

Diperbaiki di sini https://github.com/request/request/pull/2164

Lihatlah tes tentang cara menangani kesalahan dalam kode Anda.

Sepertinya menangani kesalahan seperti biasa, dengan acara .on('error', ... . Bagus!

Ini akan membuat request lebih tahan peluru, tanpa merusak aplikasi pada hal-hal bodoh di masa mendatang.

Nah, sekarang saya merasa seperti bajingan yang sangat konyol.
Saya sebenarnya sudah menyiapkan solusi yang sama persis dan tes saya akan terus gagal.
Ternyata dalam 'kasus uji sepele' saya, saya lupa menelepon t.end() .

Maaf, lain kali saya akan menerbitkan cabang saya dan meminta umpan balik.

@TimBeyer tidak masalah, versi 2.71 diterbitkan dengan perbaikan :+1:

@simov Versi 2.71 telah memperbaiki sebagian masalah untuk saya, Ini skenario saya, saya mengirim permintaan posting dan mendapatkan data sebagai potongan,

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);
            });

Ketika saya menjalankan ini saya mendapatkan kesalahan

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)

Bisakah Anda membantu dalam hal ini?

@khurrumqureshi diperbaiki di sini https://github.com/request/request/pull/2165 :+1:

Pada dasarnya pemeriksaan yang sama seperti pada metode end . Alasan mengapa adalah karena start dipanggil pada baris sebelumnya, dan sampai sekarang tidak diharapkan untuk melempar. Ketika permintaan Anda memiliki tubuh write dipanggil sebelum end , maka kesalahannya.

@simov : +1:

Sama disini.

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)

Header respons adalah:

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' ]

Header permintaan adalah:

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

Seperti yang Anda lihat, permintaan berisi 3 kali karakter khusus <U+1F44D> .

Mungkinkah itu masalahnya?

Sepertinya modul node.js https tidak mendukungnya.

Untuk berjaga-jaga jika orang lain memiliki masalah yang sama seperti saya - saya mengalami kesalahan ini dengan aws-sdk dan itu membuat saya gila selama berjam-jam. Ternyata menjadi PrvScan karakter \u001b[5~ yang karena alasan tertentu bersembunyi di file ~/.aws/credentials , yang disebarkan ke header Otorisasi yang digunakan oleh permintaan AWS. Kesalahan hanya muncul di mesin Windows 7 saya, jadi itu mungkin sesuatu dengan bagaimana file kredensial diambil dari akun AWS saya dan beberapa pengkodean karakter Windows. Itu juga tidak terlihat ketika cat memasukkan file kredensial, tetapi menjadi terlihat setelah saya membuka file dengan vi .

Ya, hanya memiliki masalah yang sama. Butuh beberapa jam untuk mengetahuinya, harus saya akui.
menggunakan MINGW64 (Git Bash) pada mesin windows. Mencoba menjalankan skrip yang sama menggunakan Node di command prompt.... dan halo.... berhasil????

Saya baru saja menemukan kesalahan yang sama dan tidak dapat menemukan cara untuk menangkapnya. Saya sedang membangun proxy gambar jadi saya tidak dapat benar-benar mengontrol apa yang dikembalikan oleh server lain. Bagaimana saya bisa menghindari carshing seluruh server dalam produksi?!

Saya memiliki masalah yang sama, itu mulai berfungsi ketika saya menukar "set" dengan "auth". Sebagai contoh:

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))
})

CONSOLE RES: ERROR, Salah GET permintaan:
TypeError [ERR_INVALID_CHAR]: Karakter tidak valid dalam konten header ["Otorisasi"]

Setelah mengubah kode menjadi:

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))
})

RES KONSOL: OKI ;p

Apakah halaman ini membantu?
0 / 5 - 0 peringkat