summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/_http_common.js3
-rw-r--r--lib/freelist.js2
-rw-r--r--src/node_http_parser.cc12
3 files changed, 15 insertions, 2 deletions
diff --git a/lib/_http_common.js b/lib/_http_common.js
index b5995476e5..f3d9d4a2eb 100644
--- a/lib/_http_common.js
+++ b/lib/_http_common.js
@@ -200,7 +200,8 @@ function freeParser(parser, req) {
parser.socket.parser = null;
parser.socket = null;
parser.incoming = null;
- parsers.free(parser);
+ if (parsers.free(parser) === false)
+ parser.close();
parser = null;
}
if (req) {
diff --git a/lib/freelist.js b/lib/freelist.js
index 61a3f78f64..588facd25b 100644
--- a/lib/freelist.js
+++ b/lib/freelist.js
@@ -39,5 +39,7 @@ exports.FreeList.prototype.free = function(obj) {
//debug("free " + this.name + " " + this.list.length);
if (this.list.length < this.max) {
this.list.push(obj);
+ return true;
}
+ return false;
};
diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc
index 04b86097ef..8d9b66ed06 100644
--- a/src/node_http_parser.cc
+++ b/src/node_http_parser.cc
@@ -169,12 +169,14 @@ class Parser : public BaseObject {
: BaseObject(env, wrap),
current_buffer_len_(0),
current_buffer_data_(NULL) {
- MakeWeak<Parser>(this);
+ Wrap(object(), this);
Init(type);
}
~Parser() {
+ ClearWrap(object());
+ persistent().Reset();
}
@@ -357,6 +359,13 @@ class Parser : public BaseObject {
}
+ static void Close(const FunctionCallbackInfo<Value>& args) {
+ HandleScope handle_scope(args.GetIsolate());
+ Parser* parser = Unwrap<Parser>(args.Holder());
+ delete parser;
+ }
+
+
void Save() {
url_.Save();
status_message_.Save();
@@ -591,6 +600,7 @@ void InitHttpParser(Handle<Object> target,
#undef V
t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "methods"), methods);
+ NODE_SET_PROTOTYPE_METHOD(t, "close", Parser::Close);
NODE_SET_PROTOTYPE_METHOD(t, "execute", Parser::Execute);
NODE_SET_PROTOTYPE_METHOD(t, "finish", Parser::Finish);
NODE_SET_PROTOTYPE_METHOD(t, "reinitialize", Parser::Reinitialize);