2012-04-30 47 views
18

目前寫在HTTP上的同步機制,我開始建立我的服務器的NodeJS,這看起來像一個很好的解決方案。定義HTTP方法與HTTP的NodeJS服務器

這樣就OK了,我可以得到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

不錯!你介意發佈你的解決方案嗎? – 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

古斯塔夫,的代碼庫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

授予懸賞這個答案,從它的一個不錯的選擇票假設(我不知道這項技術什麼,我開始賞金作爲一個忙一元的用戶。) –