使用 Nodejs HTTP 服务器的自定义 HTTP 方法

Posted

技术标签:

【中文标题】使用 Nodejs HTTP 服务器的自定义 HTTP 方法【英文标题】:Custom HTTP method with Nodejs HTTP Server 【发布时间】:2012-05-09 23:58:56 【问题描述】:

目前正在通过 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 工作吗?

【问题讨论】:

好吧,我最终通过将我的 HTTP 方法添加到源本身来解决这个问题。您需要更改可以在源包中找到的 http_parser.c 和 node_http_parser.c。然后重新编译并玩得开心。 不错!您介意发布您的解决方案吗? 嗨 :) 一年多之后,恐怕我丢失了那个源代码。但这很简单,所以您可以按照上面的简短说明来解决它。 @aspyct,您在当前版本的 NodeJS 中是否存在此添加自定义 HTTP 方法的相关代码? @VoidPointer 自从我使用 nodejs 以来已经有很多年了。不知道它现在在哪里,抱歉。 【参考方案1】:

编辑: http 解析器已经更新和改变了很多。正因为如此,添加自定义 HTTP 方法并不那么直接,但感谢节点 5.x 中的@admix - here's the relevant entry point:

    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;
  

【讨论】:

Gustav,nodejs的代码库现在变了,NodeJS目前是5.2.0。所以我在文件中找不到任何相关的代码。您能否帮助了解这是否已移至 src/ 中的其他文件?简单的 grep 没有帮助.. 对不起,我对代码库的了解并不比你好。祝你好运。【参考方案2】:

根据当前nodejs版本(5.2.0),你可以在这里找到HTTP METHODS,你可以自定义:

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

【讨论】:

授予这个答案的赏金,从投票中假设这是一个不错的选择(我对这项技术一无所知,我开始赏金是为了帮助元用户。)跨度>

以上是关于使用 Nodejs HTTP 服务器的自定义 HTTP 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Bootstrap 4 的自定义复选框状态?

nodejs中的自定义mysql函数返回未定义

带有 pycurl 的自定义标头

用于 Spotify 的自定义网络播放器

WIX 中功能的自定义操作

Amazon elastic beanstalk 上的 HTTP/HTTPS nodejs 服务器