2012-04-30 20 views
18

Actualmente escribiendo un mecanismo de sincronización sobre HTTP, comencé a construir mi servidor en NodeJS, que parecía una buena solución.Método HTTP personalizado con el servidor HTTP de Nodejs

De acuerdo, puedo hacer funcionar los métodos GET y HEAD. Pero tan pronto como trato de usar métodos no estándar, por ejemplo "SYNC". Aquí está el código:

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

ve bien ... vamos a telnet, emita un GET y luego una solicitud de sincronización

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. 

alguna idea sobre cómo puedo conseguir SYNC para trabajar?

+1

Bueno, eventualmente resolví esto agregando mi método HTTP a la fuente misma. Debe modificar http_parser.c y node_http_parser.c que puede encontrar en el paquete fuente. Luego recompila y diviértete. – aspyct

+0

¡agradable! ¿Te importaría publicar tu solución? – mikermcneil

+0

Hola :) Más de un año después, me temo que perdí ese código fuente. Pero fue bastante sencillo, por lo que probablemente pueda resolverlo siguiendo las instrucciones anteriores. – aspyct

Respuesta

10

Edit: El analizador http ha sido actualizado y cambiado bastante. Debido a esto, no es tan recta hacia adelante para agregar métodos HTTP personalizados, pero gracias a @admix - here's the relevant entry point en 5.x nodo:

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

respuesta original:

Usted tendría que nodo de parche para agregar métodos arbitrarios. Ver 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, la base de código de nodejs ha cambiado ahora, NodeJS se encuentra actualmente en 5.2.0. Entonces no pude encontrar ningún código relevante en el archivo. ¿Puedes ayudar a entender si esto se mueve a algún otro archivo en src /? Simple grep no ayudó .. – VoidPointer

+0

Lo siento, sé que la base de código no es mejor que usted. Buena suerte. –

5

De acuerdo a la versión actual nodejs (5.2.0), se pueden encontrar los métodos HTTP en aquí, que se puede personalizar:

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

código relevante:

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

Otorgando la recompensa a esta respuesta, suponiendo por los votos que es una buena opción (no sé nada sobre la tecnología, comencé la recompensa como un favor para un usuario de Meta). –