Nano Hash - криптовалюты, майнинг, программирование

Получение не HTTP-запросов в node.js

Мне нужно получать запросы в Node JS, которые почти идентичны HTTP-запросам, но имеют другое слово для HTTP в заголовке, например, первая строка запроса:

POST / RTSP/1.0

(вместо POST / HTTP/1.0)

В остальном формат запроса во всех отношениях идентичен HTTP.

Есть ли способ заставить парсер http-сервера игнорировать тот факт, что протокол называется HTTP в первой строке запроса? Итак, я могу использовать http.createServer и т. д. для получения и ответа на эти «не-HTTP» запросы?

(Я знаю, что мог бы использовать модуль net, а не модуль http, но тогда мне пришлось бы самому реализовать синтаксический анализ заголовков и т.д.)


  • ... так в чем именно заключается ваш вопрос? 22.08.2014
  • @bguiz, в принципе, есть ли способ заставить его игнорировать то, что в заголовке нет HTTP? (Без перезаписи http-сервера на разницу всего в одно слово) 22.08.2014
  • Если сервер действительно RTSP, вам все равно придется написать свой собственный. Помимо этого одного слова, если нет разницы в остальном контенте, то правильно было бы переделать сервер так, чтобы он писал HTTP вместо RTSP, к тому же это было бы намного проще. Я предполагаю, что вы спрашиваете об этом, потому что у вас нет доступа к серверу? 22.08.2014
  • У меня нет контроля над клиентским кодом (iOS и iTunes Airplay), который отправляет эти запросы POST как RTSP вместо HTTP. (согласно википедии RTSP не имеет метода POST, поэтому это HTTP) 22.08.2014
  • Извините, я перепутал сервер и клиент в своем комментарии выше. К сожалению, это оставляет вас в рассоле. Я не знаю ответа на этот вопрос - возможно, кто-то еще на этом сайте может вам помочь! 22.08.2014

Ответы:


1

Простейшим способом было бы реализовать tcp-сервер в узле, который действует как прокси-сервер, заменяющий начальный POST:

(примечание: я не тестировал этот код, но он должен быть достаточно хорош для иллюстрации идеи)

var net = require('net');

net.createServer(function(s)
{
    var sawRequest = false;
    var buff = "";
    var requestText = "";
    var connected = false;
    var cli = net.createConnection(yourHttpServerPort);
    s.on('data', function(d) {
        if (!sawRequest) {
           requestText += d.toString();
           if (requestText.match(/POST \/ RTSP\/1.0/)) {
              requestText.replace('POST / RTSP/1.0', 'POST / HTTP/1.0');
              buff = requestText;
              sawRequest = true;
           } 
        } else {
           buff += d.toString();
        }
        if (connected)
        {
           if (buff != '')
             cli.write(buff);
           cli.write(d);
        } else {
           buff += d.toString();
        }
    });
    cli.once('connect', function() {
        connected = true;
        cli.write(buff);
    });
    cli.pipe(s);

}).listen(publicFacingRTSPport);

Вероятно, вы могли бы сделать то же самое с HAProxy.

22.08.2014
  • Я бы сделал то же самое, но использовал поток преобразования между клиентским соединением и нижестоящим сервером и выполнял там регулярное выражение... 22.08.2014
  • На самом деле я повторно использовал здесь свой старый скрипт portforward.js, который старше, чем streams2 :) 22.08.2014
  • Пропущена одна из скобок: if (requestText.match(/POST \/ RTSP\/1.0/) { должно быть if (requestText.match(/POST \/ RTSP\/1.0/)) { 27.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..