使用Nodejs HTTP Server定制HTTP方法

目前通过HTTP编写同步机制,我开始在NodeJS上构build我的服务器,这看起来是一个很好的解决scheme。

好的,我可以使用GET和HEAD方法。 但只要我尝试使用非标准方法,例如“SYNC”。 代码如下:

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

看起来不错…让我们telnet这个,发出一个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工作?

编辑: httpparsing器已经被更新和改变了很多。 正因为如此,添加自定义的HTTP方法并不那么简单,但是要感谢@admix– 这里是节点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; } 

原始回复:

你将不得不修补节点,以添加任意方法。 查看相关的源代码行 :

 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版本(5.2.0),你可以在这里findHTTP方法,你可以自定义:

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