2012-04-30 2 views
18

Написав механизм синхронизации по HTTP, я начал строить свой сервер на NodeJS, который выглядел как хорошее решение.Пользовательский HTTP-метод с 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 работать?

+1

Ну, в конце концов я решил это, добавив свой HTTP-метод к самому источнику. Вам нужно изменить http_parser.c и node_http_parser.c, которые вы можете найти в исходном пакете. Затем перекомпилируйте и получайте удовольствие. – aspyct

+0

приятно! Не могли бы вы опубликовать свое решение? – mikermcneil

+0

Привет! Более года спустя, боюсь, я потерял этот исходный код. Но это было довольно просто, поэтому вы, вероятно, можете решить эту проблему, следуя приведенным выше инструкциям. – aspyct

ответ

10

Редактировать: После этого парсер http был обновлен и изменен довольно много. Из-за этого, это не совсем так прямо вперед, чтобы добавить специальные методы HTTP, но благодаря @admix - here's the relevant entry point в узле 5.x:

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; 
    } 

Оригинальный ответ:

Вы бы патч-узел для добавления произвольных методов. См the relevant source lines:

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; 
    } 
} 
+1

Gustav, базовая база nodejs теперь изменился, NodeJS в настоящее время находится в 5.2.0. Поэтому я не смог найти соответствующий код в файле. Можете ли вы помочь понять, перемещено ли это в другой файл в src /? Простой grep не помог .. – VoidPointer

+0

Извините, я знаю, что кодовая база не лучше вас. Удачи. –

5

Согласно текущей версии nodejs (5.2.0), вы можете найти методы 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); 
+0

Награждение щедростью этого ответа, считая от голосов, что это хороший выбор (я ничего не знаю об этой технологии, я начал щедрость как услугу для пользователя Meta). –

Смежные вопросы