2012-04-30 8 views
18

現在、HTTPを介して同期メカニズムを作成しているので、良い解決策のように見えるNodeJSでサーバーを構築しました。Nodejs HTTP Serverを使用したカスタムHTTPメソッド

だから、私は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が仕事を得ることができる方法上の任意のアイデアましょうか?

+1

さて、私は最終的にHTTPメソッドをソース自体に追加することでこれを解決しました。ソースパッケージ内にあるhttp_parser.cとnode_http_parser.cを変更する必要があります。その後、再コンパイルして楽しくしてください。 – aspyct

+0

nice!あなたのソリューションを投稿してもよろしいですか? – mikermcneil

+0

こんにちは:) 1年以上後、私はそのソースコードを失いました。しかし、それはかなり簡単でした。だから、あなたはおそらく上記の短い指示に従ってそれを解決することができます。 – aspyct

答えて

10

編集: httpパーサが更新され、かなり変更されました。このため、カスタムのHTTPメソッドを追加するほど単純ではないが、@admixのおかげ - ノード5.xの中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; 
    } 
} 
+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ユーザーに有利に出しました)。 –

関連する問題