400 错误请求以 req.url 形式返回 /favicon.ico。
400 bad request returning /favicon.ico as req.url in express.
我正在构建一个简单的微服务,它 return 将 url 日期参数作为 unix 和自然语言中的 Json 对象。例如,如果你去
https://cyber-clock.glitch.me/May%2013,%202015
该应用程序应该 return: {"unix":1431475200,"natural":"May 13, 2015"},
%20 是空格,所以你也可以写
https://cyber-clock.glitch.me/May 2015 年 13 日
该应用程序有效。
问题是当我写一个双倍百分比时,因为我收到 400 错误请求错误并且 url 变为:/favicon.ico,所以我无法应用修复url 和预期的响应,例如:
https://cyber-clock.glitch.me/May%%2013,%202015
您可以在这里查看源代码:https://github.com/juandata/TimeStampMicroService
在 timeStampMicroService.js 的第 22 行中,我添加了一个 console.log ,您可以在其中看到我的意思。这是该文件的代码:
var path = require('path')
var express = require('express');
var app = express();
var fs = require('fs');
var url = require('url');
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
jsonResp = {},
readableDate = "";
function Unix_timestamp(t) {
var dt = new Date(t * 1000);
var month = dt.getMonth();
var day = dt.getDate();
var year = dt.getFullYear();
return months[month] + ' ' + day + ', ' + year;
};
app.use(function(req, res, next) {
console.log(req.url);
var date = req.url.substr(1);
var miliseconds = parseInt(date);
var unixDate = new Date(miliseconds);
if (unixDate == "Invalid Date") {
var regExpr = /%20|,/;
date = date.split(regExpr);
var date1 = new Date(date[0] + " " + date[1] + "," + date[3]);
if (date1 == "Invalid Date") {
jsonResp = {
"unix": null,
"natural": null
};
res.json(jsonResp);
} else {
var date2 = date1.getTime();
var timestamp = Math.floor(date2 / 1000);
jsonResp = {
"unix": timestamp,
"natural": date[0] + " " + date[1] + ", " + date[3]
};
res.json(jsonResp);
}
} else {
readableDate = Unix_timestamp(date);
jsonResp = {
"unix": miliseconds,
"natural": readableDate
};
res.json(jsonResp);
}
});
app.listen(process.env.PORT, function() {
console.log('Node.js listening ...');
});
谁能帮我解决这个问题?
这可能是因为服务器正在尝试解码百分比编码的字符并发现格式错误 - 您将 %
紧跟在另一个字符之后,但百分比编码的字符如下所示:%HH
,其中 H 是十六进制数字,检查一下:https://www.rfc-editor.org/rfc/rfc3986#section-2.1
因此,错误一定是在您的应用获得 url 之前就已经发生了。只是不要试图通过这样的 url。如果你想制作一个带有百分比字符的 url,使用 %25
,就像这里:https://cyber-clock.glitch.me/May%25%2013,%202015
如果您想处理此类 URI,您可能需要实现自己的 HTTP 服务器(HTTP 请求处理程序)。
我正在构建一个简单的微服务,它 return 将 url 日期参数作为 unix 和自然语言中的 Json 对象。例如,如果你去 https://cyber-clock.glitch.me/May%2013,%202015 该应用程序应该 return: {"unix":1431475200,"natural":"May 13, 2015"}, %20 是空格,所以你也可以写 https://cyber-clock.glitch.me/May 2015 年 13 日 该应用程序有效。 问题是当我写一个双倍百分比时,因为我收到 400 错误请求错误并且 url 变为:/favicon.ico,所以我无法应用修复url 和预期的响应,例如: https://cyber-clock.glitch.me/May%%2013,%202015
您可以在这里查看源代码:https://github.com/juandata/TimeStampMicroService
在 timeStampMicroService.js 的第 22 行中,我添加了一个 console.log ,您可以在其中看到我的意思。这是该文件的代码:
var path = require('path')
var express = require('express');
var app = express();
var fs = require('fs');
var url = require('url');
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
jsonResp = {},
readableDate = "";
function Unix_timestamp(t) {
var dt = new Date(t * 1000);
var month = dt.getMonth();
var day = dt.getDate();
var year = dt.getFullYear();
return months[month] + ' ' + day + ', ' + year;
};
app.use(function(req, res, next) {
console.log(req.url);
var date = req.url.substr(1);
var miliseconds = parseInt(date);
var unixDate = new Date(miliseconds);
if (unixDate == "Invalid Date") {
var regExpr = /%20|,/;
date = date.split(regExpr);
var date1 = new Date(date[0] + " " + date[1] + "," + date[3]);
if (date1 == "Invalid Date") {
jsonResp = {
"unix": null,
"natural": null
};
res.json(jsonResp);
} else {
var date2 = date1.getTime();
var timestamp = Math.floor(date2 / 1000);
jsonResp = {
"unix": timestamp,
"natural": date[0] + " " + date[1] + ", " + date[3]
};
res.json(jsonResp);
}
} else {
readableDate = Unix_timestamp(date);
jsonResp = {
"unix": miliseconds,
"natural": readableDate
};
res.json(jsonResp);
}
});
app.listen(process.env.PORT, function() {
console.log('Node.js listening ...');
});
谁能帮我解决这个问题?
这可能是因为服务器正在尝试解码百分比编码的字符并发现格式错误 - 您将 %
紧跟在另一个字符之后,但百分比编码的字符如下所示:%HH
,其中 H 是十六进制数字,检查一下:https://www.rfc-editor.org/rfc/rfc3986#section-2.1
因此,错误一定是在您的应用获得 url 之前就已经发生了。只是不要试图通过这样的 url。如果你想制作一个带有百分比字符的 url,使用 %25
,就像这里:https://cyber-clock.glitch.me/May%25%2013,%202015
如果您想处理此类 URI,您可能需要实现自己的 HTTP 服务器(HTTP 请求处理程序)。