2012-04-30 23 views
18

Şu anda HTTP üzerinden bir senkronizasyon mekanizması yazıyor, sunucumu NodeJS'de oluşturmaya başladım, bu da iyi bir çözüm gibi görünüyordu.Nodejs HTTP Sunucusu ile Özel HTTP yöntemi

Peki, GET ve HEAD yöntemlerini çalıştırabilirim. Ancak standart olmayan yöntemleri kullanmaya çalıştığımda, örneğin "SYNC".

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

yolunda görünüyor ... bakalım telnet bu, bir GET ve daha sonra bir SYNC isteği

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. 

Ben SYNC işe nasıl alabilirim herhangi bir fikir vermek: İşte kod?

+1

Bunu sonunda HTTP yöntemimi kaynağa ekleyerek çözdüm. Kaynak paketinde bulabileceğiniz http_parser.c ve node_http_parser.c dosyalarını değiştirmeniz gerekiyor. Sonra yeniden derleyin ve eğlenin. – aspyct

+0

güzel! Çözümünüzü yayınlamak ister misiniz? – mikermcneil

+0

Merhaba :) Bir yıldan uzun bir süre sonra, bu kaynak kodunu kaybettiğimi düşünüyorum. Ama oldukça basitti, bu yüzden muhtemelen yukarıdaki kısa talimatları izleyerek çözebilirsiniz. – aspyct

cevap

10

Düzeltme: http çözümleyici güncellendi ve çok değişti. Bu nedenle, bu özel HTTP yöntemleri eklemek oldukça olarak düz ileri değil, ama teşekkürler @admix için - here's the relevant entry point düğüm 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; 
    } 

Orjinal Cevap: Sen hiç

olurdu rasgele yöntemler eklemek için yama düğümü. the relevant source lines Bkz:

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, kod tabanı nodejs şimdi değişti, NodeJS şu anda 5.2.0. Bu yüzden dosyada herhangi bir ilgili kod bulamadım. Bunun src'de başka bir dosyaya taşınıp taşınmadığını anlamaya yardımcı olabilir misiniz? Basit grep yardım etmedi .. – VoidPointer

+0

Üzgünüm, kod tabanını senden daha iyi bilmiyorum. İyi şanslar. –

5

akım nodejs sürümü (5.2.0) 'a göre, size özelleştirebileceğiniz, burada HTTP YÖNTEMLERİ bulabilirsiniz:

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

İlgili 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

Bu cevabın ödülüne layık görülen, oyların iyi bir seçim olduğunu varsayarak (teknoloji hakkında hiçbir şey bilmiyorum, bir meta kullanıcısına bir iyilik olarak lütufta başladım.) –