400 неправильных запросов, возвращающих /favicon.ico как req.url в экспресс. - PullRequest
0 голосов
/ 04 мая 2018

Я создаю простой микросервис, который возвращает параметры даты url в виде объекта Json на Unix и естественном языке. Например, если вы идете в https://cyber -clock.glitch.me / май 2013%,% 202015 приложение должно вернуть: {"unix": 1431475200, "natural": "13 мая 2015"} , % 20 - это пробелы, поэтому вы также можете написать https://cyber -clock.glitch.me / May 13, 2015 и приложение работает. Проблема заключается в том, что я пишу двойной процент, потому что получаю ошибку 400 неверных запросов, а URL становится: / favicon.ico , поэтому я не могу применить исправления к URL и ответу, как ожидается, например: https://cyber -clock.glitch.me / май %% 2013,% 202015

Вы можете проверить исходный код здесь: https://github.com/juandata/TimeStampMicroService

В строке 22 timeStampMicroService.js я добавил 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 ...');
});

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 04 мая 2018

Вероятно, это происходит потому, что сервер пытается декодировать кодированный в процентах символ и обнаруживает, что формат неправильный - вы ставите % сразу после другого, но кодированные в процентах символы выглядят так: %HH, где H является шестнадцатеричной цифрой, проверьте это: https://tools.ietf.org/html/rfc3986#section-2.1

Итак, ошибка должна возникать еще до того, как ваше приложение получит URL. Только не пытайтесь передать такой URL. Если вы хотите создать URL с символом процента, используйте %25, как здесь: https://cyber -clock.glitch.me / May% 25% 2013,% 202015

В случае, если вы хотите обрабатывать такие URI, вам может потребоваться реализовать собственный HTTP-сервер (обработчик HTTP-запросов).

...