-
Notifications
You must be signed in to change notification settings - Fork 0
/
ApacheRequest.cc
94 lines (72 loc) · 3.2 KB
/
ApacheRequest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "ApacheRequest.h"
#include "ApacheTable.h"
using namespace v8;
namespace mod_node {
static Persistent<FunctionTemplate> req_function_template;
static Persistent<Function> req_function;
void ApacheRequest::Initialize(Handle<Object> target) {
HandleScope scope;
if(req_function_template.IsEmpty()) {
req_function_template = Persistent<FunctionTemplate>(FunctionTemplate::New());
req_function_template->SetClassName(String::NewSymbol("ApacheRequest"));
Handle <ObjectTemplate> itemplate = req_function_template->InstanceTemplate();
itemplate->SetInternalFieldCount(1);
itemplate->SetAccessor(String::New("headers_in"), GetHeadersIn);
itemplate->SetAccessor(String::New("headers_out"), GetHeadersOut);
NODE_SET_PROTOTYPE_METHOD(req_function_template, "write", Write);
NODE_SET_PROTOTYPE_METHOD(req_function_template, "end", End);
}
req_function = Persistent<Function>::New(req_function_template->GetFunction());
target->Set(String::New("ApacheRequest"), req_function);
}
Handle<Value> ApacheRequest::GetHeadersIn(Local<String> property, const AccessorInfo& info) {
ApacheRequest *req = ObjectWrap::Unwrap<ApacheRequest>(info.Holder());
return req->HeadersIn;
}
Handle<Value> ApacheRequest::GetHeadersOut(Local<String> property, const AccessorInfo& info) {
ApacheRequest *req = ObjectWrap::Unwrap<ApacheRequest>(info.Holder());
return req->HeadersOut;
}
Handle<Object> ApacheRequest::New(request_ext *rex) {
Handle<Object> req = req_function->NewInstance();
ApacheRequest *s = new ApacheRequest(rex);
s->Wrap(req);
return req;
}
Handle<Value> ApacheRequest::Write(const Arguments &args) {
ApacheRequest *req = ObjectWrap::Unwrap<ApacheRequest>(args.Holder());
if (args.Length() == 0 || !args[0]->IsString()) {
return ThrowException(Exception::TypeError(
String::New("First argument must be a string")));
}
// @todo: handle buffers too; handle multiple strings with rvputs
String::Utf8Value str(args[0]->ToString());
req->rputs(*str);
return Undefined();
}
Handle<Value> ApacheRequest::End(const Arguments &args) {
if(args.Length() > 0) Write(args);
ApacheRequest *req = ObjectWrap::Unwrap<ApacheRequest>(args.Holder());
req->end();
// Signal condition variable
return Undefined();
}
ApacheRequest::ApacheRequest(request_ext *rex): rex(rex) {
HeadersIn = Persistent<Value>::New(ApacheTable::New(rex->req->headers_in));
HeadersOut = Persistent<Value>::New(ApacheTable::New(rex->req->headers_out));
}
ApacheRequest::~ApacheRequest() {
HeadersIn.Dispose();
HeadersOut.Dispose();
}
void ApacheRequest::rputs(char *str) {
ap_rputs(str, rex->req);
}
void ApacheRequest::end() {
apr_table_get(rex->req->notes, "mod_node"); // @todo Errors
rex->cont_request = 1;
apr_thread_mutex_lock(rex->mtx);
apr_thread_cond_signal(rex->cv);
apr_thread_mutex_unlock(rex->mtx);
}
};