Вопрос по node.js, http – Пользовательский метод HTTP с сервером Nodejs HTTP

18

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

Итак, я могу получить методы GET и HEAD. Но как только я пытаюсь использовать нестандартные методы, например "SYNC". Вот код:

var http = require("http");
var server = http.createServer(function (req, res) {
    res.writeHead(200);
    res.end(req.method);
});
server.listen(8080);

Выглядит хорошо ... давайте рассмотрим это, выполните GET, а затем запрос SYNC.

mylaptop:~ aob$ telnet localhost 8080
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK
Connection: keep-alive
Transfer-Encoding: chunked

3
GET
0

SYNC / HTTP/1.1
Connection closed by foreign host.

Любая идея о том, как я могу заставить работать SYNC?

отлично! Не могли бы вы опубликовать свое решение? mikermcneil
Привет :) Больше года спустя я боюсь, что потерял этот исходный код. Но это было довольно просто, так что вы можете решить эту проблему, следуя кратким инструкциям выше. aspyct
@VoidPointer Прошло много лет с тех пор, как я работал с nodejs. Понятия не имею, где это сейчас, извините. aspyct
@aspyct, где в данной версии NodeJS существует соответствующий код для добавления собственного HTTP-метода? VoidPointer
Ну, в конце концов я решил эту проблему, добавив свой метод HTTP к самому источнику. Вам нужно изменить http_parser.c и node_http_parser.c, которые вы можете найти в пакете с исходным кодом. Затем перекомпилируйте и получайте удовольствие. aspyct

Ваш Ответ

2   ответа
10

Edit: С тех пор http-парсер был обновлен и довольно сильно изменился. Из-за этого добавлять пользовательские методы HTTP не так просто, но благодаря @admix -здесь соответствующая точка входа в узле 5.x:

          case 'A': parser->method = HTTP_ACL; break;
      case 'B': parser->method = HTTP_BIND; break;
      case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
      case 'D': parser->method = HTTP_DELETE; break;
      case 'G': parser->method = HTTP_GET; break;
      case 'H': parser->method = HTTP_HEAD; break;
      case 'L': parser->method = HTTP_LOCK; /* or LINK */ break;
      case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
      case 'N': parser->method = HTTP_NOTIFY; break;
      case 'O': parser->method = HTTP_OPTIONS; break;
      case 'P': parser->method = HTTP_POST;
        /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
        break;
      case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
      case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
      case 'T': parser->method = HTTP_TRACE; break;
      case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break;
      default:
        SET_ERRNO(HPE_INVALID_METHOD);
        goto error;
    }

Original reply:

Вы должны будете исправить узел, чтобы добавить произвольные методы. Увидетьсоответствующие строки источника:

static inline Persistent<String>
method_to_str(unsigned short m) {
  switch (m) {
    case HTTP_DELETE:     return delete_sym;
    case HTTP_GET:        return get_sym;
    case HTTP_HEAD:       return head_sym;
    case HTTP_POST:       return post_sym;
    case HTTP_PUT:        return put_sym;
    case HTTP_CONNECT:    return connect_sym;
    case HTTP_OPTIONS:    return options_sym;
    case HTTP_TRACE:      return trace_sym;
    case HTTP_PATCH:      return patch_sym;
    case HTTP_COPY:       return copy_sym;
    case HTTP_LOCK:       return lock_sym;
    case HTTP_MKCOL:      return mkcol_sym;
    case HTTP_MOVE:       return move_sym;
    case HTTP_PROPFIND:   return propfind_sym;
    case HTTP_PROPPATCH:  return proppatch_sym;
    case HTTP_UNLOCK:     return unlock_sym;
    case HTTP_REPORT:     return report_sym;
    case HTTP_MKACTIVITY: return mkactivity_sym;
    case HTTP_CHECKOUT:   return checkout_sym;
    case HTTP_MERGE:      return merge_sym;
    case HTTP_MSEARCH:    return msearch_sym;
    case HTTP_NOTIFY:     return notify_sym;
    case HTTP_SUBSCRIBE:  return subscribe_sym;
    case HTTP_UNSUBSCRIBE:return unsubscribe_sym;
    default:              return unknown_method_sym;
  }
}
Извините, я знаю кодовую базу не лучше вас. Удачи.
Густав, кодовая база nodejs теперь изменилась, NodeJS в настоящее время находится на 5.2.0. Поэтому я не смог найти соответствующий код в файле. Можете ли вы помочь понять, перемещено ли это в какой-то другой файл в src /? Простой grep не помог ..
5

МЕТОДЫ HTTP, которые вы можете настроить:

https://github.com/nodejs/node/blob/master/deps/http_parser/http_parser.c#L961

Соответствующий код:

parser->method = (enum http_method) 0;
    parser->index = 1;
    switch (ch) {
      case 'A': parser->method = HTTP_ACL; break;
      case 'B': parser->method = HTTP_BIND; break;
      case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
      case 'D': parser->method = HTTP_DELETE; break;
      case 'G': parser->method = HTTP_GET; break;
      case 'H': parser->method = HTTP_HEAD; break;
      case 'L': parser->method = HTTP_LOCK; /* or LINK */ break;
      case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
      case 'N': parser->method = HTTP_NOTIFY; break;
      case 'O': parser->method = HTTP_OPTIONS; break;
      case 'P': parser->method = HTTP_POST;
        /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
        break;
      case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
      case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
      case 'T': parser->method = HTTP_TRACE; break;
      case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break;
      default:
        SET_ERRNO(HPE_INVALID_METHOD);
        goto error;
    }
    UPDATE_STATE(s_req_method);
Награждение вознаграждением за этот ответ, исходя из голосов, что это хороший выбор (я ничего не знаю о технологии, я учредил вознаграждение как одолжение для пользователя Meta).

Похожие вопросы