2012-04-30 25 views
18

Obecnie pisząc mechanizm synchronizacji przez HTTP, zacząłem budować mój serwer na NodeJS, który wyglądał jak dobre rozwiązanie.Niestandardowa metoda HTTP z serwerem HTTP Nodejs

Tak Ok, mogę uruchomić metody GET i HEAD. Ale jak tylko spróbuję użyć niestandardowych metod, na przykład "SYNC". Oto kod:

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

Wygląda w porządku ... telnet to niech wystawi GET i następnie wniosek 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. 

Każdy pomysł, w jaki sposób mogę uzyskać SYNC do pracy?

+1

Cóż, ostatecznie rozwiązałem to przez dodanie mojej metody HTTP do samego źródła. Musisz zmienić http_parser.c i node_http_parser.c, które można znaleźć w pakiecie źródłowym. Następnie przekompiluj i baw się dobrze. – aspyct

+0

fajnie! Czy mógłbyś opublikować swoje rozwiązanie? – mikermcneil

+0

Witam :) Ponad rok później, obawiam się, że zgubiłem ten kod źródłowy. Ale było to dość proste, więc prawdopodobnie możesz go rozwiązać, wykonując krótkie instrukcje powyżej. – aspyct

Odpowiedz

10

Edytuj: Parser HTTP został od tego czasu zaktualizowany i zmieniony. z tego powodu, że nie jest aż tak prosta, aby dodać niestandardowe metody HTTP, ale dzięki @admix - here's the relevant entry point w węźle 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; 
    } 

Oryginalny odpowiedź:

Trzeba by węzeł łatki w celu dodania dowolnych metod. Zobacz 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, podstawa kodu nodejs zmienił się teraz, NodeJS ma obecnie 5.2.0. Nie mogłem znaleźć żadnego odpowiedniego kodu w pliku. Czy możesz pomóc w zrozumieniu, czy jest to przeniesione do innego pliku w src /? Simple grep nie pomógł ... – VoidPointer

+0

Przepraszam, wiem, że kod nie jest lepszy od ciebie. Powodzenia. –

5

Według aktualnej wersji (5.2.0) nodejs można znaleźć w tutaj metod HTTP, które można dostosować:

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

odpowiedni kod:

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

Przyznawszy nagrodę za tę odpowiedź, zakładając z głosów, że jest to dobry wybór (nie wiem nic o tej technologii, zacząłem nagrodę jako przysługę dla użytkownika Meta). –