Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Bugfix: Don't segfault on unknown http method

Reported by Chakrit Wichian.
  • Loading branch information...
commit 9553503be5b9efa06cefd5c813fe7b861cba495b 1 parent 8fd46a3
@ry ry authored
Showing with 58 additions and 2 deletions.
  1. +58 −2 src/node_http.cc
View
60 src/node_http.cc
@@ -29,6 +29,23 @@ static Persistent<String> header_complete_symbol;
static Persistent<String> body_symbol;
static Persistent<String> eof_symbol;
+static Persistent<String> delete_sym;
+static Persistent<String> get_sym;
+static Persistent<String> head_sym;
+static Persistent<String> post_sym;
+static Persistent<String> put_sym;
+static Persistent<String> connect_sym;
+static Persistent<String> options_sym;
+static Persistent<String> trace_sym;
+static Persistent<String> copy_sym;
+static Persistent<String> lock_sym;
+static Persistent<String> mkcol_sym;
+static Persistent<String> move_sym;
+static Persistent<String> propfind_sym;
+static Persistent<String> proppatch_sym;
+static Persistent<String> unlock_sym;
+static Persistent<String> unknown_method_sym;
+
void
HTTPConnection::Initialize (Handle<Object> target)
{
@@ -53,6 +70,24 @@ HTTPConnection::Initialize (Handle<Object> target)
status_code_symbol = NODE_PSYMBOL("statusCode");
http_version_symbol = NODE_PSYMBOL("httpVersion");
should_keep_alive_symbol = NODE_PSYMBOL("should_keep_alive");
+
+
+ delete_sym = NODE_PSYMBOL("DELETE");
+ get_sym = NODE_PSYMBOL("GET");
+ head_sym = NODE_PSYMBOL("HEAD");
+ post_sym = NODE_PSYMBOL("POST");
+ put_sym = NODE_PSYMBOL("PUT");
+ connect_sym = NODE_PSYMBOL("CONNECT");
+ options_sym = NODE_PSYMBOL("OPTIONS");
+ trace_sym = NODE_PSYMBOL("TRACE");
+ copy_sym = NODE_PSYMBOL("COPY");
+ lock_sym = NODE_PSYMBOL("LOCK");
+ mkcol_sym = NODE_PSYMBOL("MKCOL");
+ move_sym = NODE_PSYMBOL("MOVE");
+ propfind_sym = NODE_PSYMBOL("PROPFIND");
+ proppatch_sym = NODE_PSYMBOL("PROPPATCH");
+ unlock_sym = NODE_PSYMBOL("UNLOCK");
+ unknown_method_sym = NODE_PSYMBOL("UNKNOWN_METHOD");
}
Handle<Value>
@@ -242,6 +277,28 @@ HTTPConnection::on_header_value (http_parser *parser, const char *buf, size_t le
return 0;
}
+static inline Persistent<String>
+method_to_str(enum http_method 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_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;
+ default: return unknown_method_sym;
+ }
+}
+
int
HTTPConnection::on_headers_complete (http_parser *parser)
{
@@ -253,8 +310,7 @@ HTTPConnection::on_headers_complete (http_parser *parser)
// METHOD
if (connection->type_ == HTTP_REQUEST) {
- message_info->Set(method_symbol, String::NewSymbol(
- http_method_str(connection->parser_.method)));
+ message_info->Set(method_symbol, method_to_str(connection->parser_.method));
}
// STATUS
Please sign in to comment.
Something went wrong with that request. Please try again.