Прокси-сервер неправильно обрабатывает запрос OPTIONS - PullRequest
3 голосов
/ 03 марта 2020

У меня есть такая простая node.js реализация прокси-сервера:

const s = http.createServer((req, res) => {

  console.log('req method:', req.method);

  if(String(req.method || '').toUpperCase() === 'OPTIONS'){
    res.setHeader('Access-Control-Expose-Headers', '*');
    res.setHeader('Access-Control-Allow-Credentials', 'true');
    res.setHeader('Access-Control-Max-Age', '3600');
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', '*');
    res.setHeader('Access-Control-Allow-Methods', '*');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('Access-Control-Request-Method', 'POST');
    res.setHeader('Allow', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');
    res.setHeader('Allowed', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');
    return res.writeHead(200);
  }

  // ...
});

проблема в том, что он не получает никаких запросов, кроме запросов OPTIONS, и я подозреваю, что это потому, что он не обрабатывает запросы OPTIONS правильно. Я хочу разрешить все, потому что все это выполняется локально на localhost - что-то не так с обработкой запросов OPTIONS для этого прокси-сервера?

Когда я использую библиотеку http-proxy, кажется, что все работает хорошо:

const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({target:'http://localhost:2020'});
const s = http.createServer((req,res) => proxy.web(req,res));

.. поэтому что-то не так с моей реализацией ... Я думаю, что самый основной вопрос c - как прокси-сервер, я должен перенаправлять запросы OPTIONS на прокси-сервер или просто отвечать рано? это определенно первый пункт решения ..

1 Ответ

2 голосов
/ 10 марта 2020

Я заметил одну вещь: вам не хватает заголовка Content-Length.

Согласно RFC7231, раздел 4.3.7 , вы должны отправить

Content-Length: 0

если у вас нет тела ответа.

А что касается 2-й части вашего вопроса: запросы OPTIONS должны быть перенаправлены на целевой сервер. Они не кэшируются.

...