Соответствует ли Express.js RFC-3986 для строки запроса? - PullRequest
2 голосов
/ 09 мая 2019

Соблюдает ли ExpressJs / использует стандарт RFC-3986 при декодировании параметров строки запроса? Почему прямой символ "è" принят, а кодированная версия "% E8" - нет?

Проверка Expressjs http-сервера

'use strict';

const express = require('express');
const bodyParser = require('body-parser');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/test?', (req, res, next) => {
  console.log(req.query);
  res.status(200);
});

app.listen(4567, '127.0.0.1', () => {
    console.log('test http server started');
});

Запрос

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+%E8+bar

Ожидаемый журнал

{ message: 'lorem ipsum, foo è bar' }

Журналы сервера

{ message: 'lorem+ipsum%2C%20foo+%E8+bar' }

Если удалить символ% E8 "è"

Запрос

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+bar

Журналы сервера

{ message: 'lorem ipsum, foo bar' }

Здесь (https://www.url -encode-decode.com / ) я могу прочитать, что для URI может применяться RFC-3986, который не допускает символы типа è, é, à .. .

Так что, кажется, что Экспресс отказывается от этих символов, но если мы попробуем

Запрос

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar

Ожидаемый журнал

{ message: 'lorem+ipsum%2C%20foo+è+bar' }

Журналы сервера

{ message: 'lorem ipsum, foo è bar' }

То есть прямой символ "è" принят, а кодированная версия% E8 - нет?

Я пытался читать источники ExpressJS, но не могу найти ответ.

1 Ответ

1 голос
/ 09 мая 2019

В основном самостоятельно решается:

Прежде всего, я обнаружил, что в UTF-8 гекс «è» - это «C3A8», а не «E8».

Так что Express , вероятно, принимает все символы UTF-8 без применения стандарта RFC-3986. Это объяснит, почему «E8» не принят, а прямой символ «è». «E8» не принимается, потому что в UTF-8 он не соответствует никому.

...