Express.js 是否遵守查询字符串的 RFC-3986?
Does Express.js respect RFC-3986 for query string?
ExpressJs respect/use 解码查询字符串参数时是否符合 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,它不允许像 è、é、à...
所以 Express 似乎拒绝了那些字符,但是如果我们尝试
请求
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar
预期日志
{ message: 'lorem+ipsum%2C%20foo+è+bar' }
服务器日志
{ message: 'lorem ipsum, foo è bar' }
所以直接字符“è”被接受但编码版本 %E8 不被接受?
我已尝试阅读 ExpressJS 源代码,但找不到响应。
基本自己解决了:
首先我发现在 UTF-8 中 'è' 的十六进制是 'C3A8' 而不是 'E8'。
所以 Express 可能 接受所有 UTF-8 字符,而不应用 RFC-3986 标准。这将解释为什么 'E8' 不被接受但直接字符 'è' 被接受。 'E8' 未被接受,因为它与 UTF-8 中的任何内容都不匹配。
ExpressJs respect/use 解码查询字符串参数时是否符合 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,它不允许像 è、é、à...
所以 Express 似乎拒绝了那些字符,但是如果我们尝试
请求
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar
预期日志
{ message: 'lorem+ipsum%2C%20foo+è+bar' }
服务器日志
{ message: 'lorem ipsum, foo è bar' }
所以直接字符“è”被接受但编码版本 %E8 不被接受?
我已尝试阅读 ExpressJS 源代码,但找不到响应。
基本自己解决了:
首先我发现在 UTF-8 中 'è' 的十六进制是 'C3A8' 而不是 'E8'。
所以 Express 可能 接受所有 UTF-8 字符,而不应用 RFC-3986 标准。这将解释为什么 'E8' 不被接受但直接字符 'è' 被接受。 'E8' 未被接受,因为它与 UTF-8 中的任何内容都不匹配。