webroar 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +48 -1
- data/README +11 -14
- data/Rakefile +1 -1
- data/conf/mime_type.yml +172 -166
- data/conf/server_internal_config.yml +30 -8
- data/doc/user-guide.html +294 -153
- data/doc/user-guide.txt +9 -13
- data/lib/command_runner.rb +1 -0
- data/lib/dependencies.rb +18 -15
- data/lib/installer.rb +115 -50
- data/src/admin_panel/app/controllers/admin_controller.rb +1 -15
- data/src/admin_panel/app/controllers/application_controller.rb +2 -2
- data/src/admin_panel/app/controllers/application_specification_controller.rb +2 -1
- data/src/admin_panel/app/controllers/headers_controller.rb +73 -0
- data/src/admin_panel/app/controllers/mail_specification_controller.rb +10 -0
- data/src/admin_panel/app/controllers/server_specification_controller.rb +14 -0
- data/src/admin_panel/app/helpers/admin_helper.rb +0 -85
- data/src/admin_panel/app/models/app.rb +1 -1
- data/src/admin_panel/app/models/application_specification.rb +33 -25
- data/src/admin_panel/app/models/headers.rb +116 -0
- data/src/admin_panel/app/models/mail_specification.rb +20 -5
- data/src/admin_panel/app/models/server_specification.rb +2 -7
- data/src/admin_panel/app/views/admin/configuration.html.erb +10 -5
- data/src/admin_panel/app/views/exceptions/_exception_list_partial.html.erb +4 -4
- data/src/admin_panel/app/views/graph/_graph_page.html.erb +3 -0
- data/src/admin_panel/app/views/headers/_add_expires_text_box.html.erb +35 -0
- data/src/admin_panel/app/views/headers/_expires_by_type_form.html.erb +65 -0
- data/src/admin_panel/app/views/headers/_headers_table.html.erb +113 -0
- data/src/admin_panel/app/views/mail_specification/_current_spec.html.erb +168 -0
- data/src/admin_panel/app/views/{admin → server_specification}/_add_div.html.erb +1 -1
- data/src/admin_panel/config/initializers/application_constants.rb +6 -0
- data/src/admin_panel/lib/control.rb +6 -3
- data/src/admin_panel/lib/scgi.rb +74 -21
- data/src/admin_panel/lib/yaml_writer.rb +51 -17
- data/src/admin_panel/public/javascripts/application.js +20 -1
- data/src/head/wr_access_log.c +2 -2
- data/src/head/wr_application.c +294 -236
- data/src/head/wr_application.h +8 -8
- data/src/head/wr_configurator.c +451 -517
- data/src/head/wr_configurator.h +10 -115
- data/src/head/wr_connection.c +26 -25
- data/src/head/wr_connection.h +2 -3
- data/src/head/wr_controller.c +110 -93
- data/src/head/wr_controller.h +6 -6
- data/src/head/wr_main.c +31 -24
- data/src/head/wr_request.c +70 -93
- data/src/head/wr_request.h +0 -4
- data/src/head/wr_resolver.c +21 -15
- data/src/head/wr_resolver.h +2 -2
- data/src/head/wr_server.c +36 -26
- data/src/head/wr_server.h +5 -5
- data/src/head/wr_worker.c +551 -512
- data/src/head/wr_worker.h +33 -20
- data/src/helper/wr_config.c +316 -0
- data/src/helper/wr_config.h +235 -0
- data/src/helper/wr_helper.h +1 -5
- data/src/helper/wr_logger.c +4 -4
- data/src/helper/wr_scgi.c +3 -4
- data/src/helper/wr_scgi.h +2 -0
- data/src/helper/wr_string.h +2 -2
- data/src/helper/wr_util.c +3 -1
- data/src/helper/wr_util.h +0 -0
- data/src/helper/wr_yaml_parser.c +30 -0
- data/src/helper/wr_yaml_parser.h +1 -0
- data/src/ruby_lib/exception_tracker/instrumentation/action_controller.rb +2 -1
- data/src/ruby_lib/mailer/smtpmail.rb +7 -4
- data/src/ruby_lib/profiler/instrumentation/action_controller.rb +2 -1
- data/src/ruby_lib/profiler/instrumentation/active_record.rb +3 -0
- data/src/ruby_lib/rack/adapter/rails.rb +14 -7
- data/src/ruby_lib/ruby_interface/client.rb +1 -1
- data/src/ruby_lib/ruby_interface/version.rb +2 -2
- data/src/ruby_lib/webroar_app_loader.rb +4 -2
- data/src/worker/wkr_controller.c +200 -140
- data/src/worker/wkr_http.c +14 -28
- data/src/worker/wkr_http.h +4 -4
- data/src/worker/wkr_http_request.c +12 -11
- data/src/worker/wkr_http_request.h +7 -8
- data/src/worker/wkr_http_response.c +10 -14
- data/src/worker/wkr_http_response.h +0 -1
- data/src/worker/wkr_main.c +74 -140
- data/src/worker/wkr_static.c +295 -108
- data/src/worker/wkr_static.h +20 -7
- data/src/worker/worker.c +245 -70
- data/src/worker/worker.h +46 -34
- data/tasks/compile.rake +128 -175
- data/tasks/test.rake +345 -469
- data/test/spec/webroar_command_spec.rb +23 -0
- metadata +173 -43
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/README +0 -34
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/Rakefile +0 -13
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/init.rb +0 -5
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/action_mailer_tls.rb +0 -16
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/smtp_tls.rb +0 -123
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/test/tls_test.rb +0 -42
- data/src/head/wr_config.h +0 -165
- data/src/ruby_lib/mailer/action_mailer_tls.rb +0 -16
- data/src/ruby_lib/mailer/smtp_tls.rb +0 -123
data/src/worker/wkr_controller.c
CHANGED
|
@@ -18,13 +18,21 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
#include <worker.h>
|
|
21
|
-
#include <wr_logger.h>
|
|
22
21
|
#include <netinet/in.h>
|
|
23
22
|
#include <sys/un.h>
|
|
24
23
|
|
|
24
|
+
#define WR_CTL_ACK_TIMEOUT 15.
|
|
25
|
+
|
|
25
26
|
extern int is_alive;
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
int ctl_msg_process(wkr_t* w);
|
|
29
|
+
|
|
30
|
+
void ctl_ack_timeout_cb(struct ev_loop *loop, ev_timer *w, int revents) {
|
|
31
|
+
LOG_INFO("Control message timeout");
|
|
32
|
+
is_alive = 0;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
wkr_ctl_t* wkr_ctl_new(wkr_t *w) {
|
|
28
36
|
LOG_FUNCTION
|
|
29
37
|
wkr_ctl_t *ctl = wr_malloc(wkr_ctl_t);
|
|
30
38
|
|
|
@@ -34,8 +42,13 @@ wkr_ctl_t* wkr_ctl_new() {
|
|
|
34
42
|
|
|
35
43
|
ctl->fd = -1;
|
|
36
44
|
ctl->msg_size = ctl->bytes_read = 0;
|
|
45
|
+
ctl->w_read.data = ctl->w_write.data = w;
|
|
37
46
|
ctl->scgi = NULL;
|
|
47
|
+
ctl->error = FALSE;
|
|
48
|
+
ctl->t_ack.data = ctl;
|
|
38
49
|
|
|
50
|
+
ev_timer_init (&ctl->t_ack, ctl_ack_timeout_cb, 0., WR_CTL_ACK_TIMEOUT);
|
|
51
|
+
|
|
39
52
|
return ctl;
|
|
40
53
|
}
|
|
41
54
|
|
|
@@ -52,53 +65,60 @@ void wkr_ctl_free(wkr_ctl_t **c) {
|
|
|
52
65
|
*c = NULL;
|
|
53
66
|
}
|
|
54
67
|
|
|
55
|
-
/**
|
|
56
|
-
|
|
68
|
+
/** Connect to head process **/
|
|
69
|
+
int connect_to_head(wkr_t *w){
|
|
57
70
|
LOG_FUNCTION
|
|
58
71
|
wkr_ctl_t *ctl = w->ctl;
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
72
|
+
|
|
73
|
+
if(w->is_uds == FALSE) {
|
|
74
|
+
struct sockaddr_in addr;
|
|
75
|
+
|
|
76
|
+
LOG_DEBUG(DEBUG,"connect_to_head() port = %i", w->listen_port);
|
|
77
|
+
|
|
78
|
+
if ((ctl->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
|
79
|
+
LOG_ERROR(WARN,"socket():%s",strerror(errno));
|
|
80
|
+
return FALSE;
|
|
81
|
+
}
|
|
82
|
+
setsocketoption(ctl->fd);
|
|
83
|
+
LOG_DEBUG(DEBUG,"connect_to_head() FD for control.fd is %d",ctl->fd);
|
|
84
|
+
|
|
85
|
+
int iport = atoi(w->tmp->ctl_path.str);
|
|
86
|
+
addr.sin_family = AF_INET; // host byte order
|
|
87
|
+
addr.sin_port = htons(iport); // short, network byte order
|
|
88
|
+
addr.sin_addr.s_addr = htonl(INADDR_ANY); // auto-fill with my IP
|
|
89
|
+
memset(addr.sin_zero, '\0', sizeof addr.sin_zero);
|
|
90
|
+
|
|
91
|
+
if(connect(ctl->fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
|
|
92
|
+
LOG_ERROR(SEVERE,"Connection with controller failed:%s",strerror(errno));
|
|
93
|
+
return FALSE;
|
|
94
|
+
}
|
|
95
|
+
}else{
|
|
96
|
+
LOG_DEBUG(DEBUG,"connect_to_head() path = %s", w->sock_path.str);
|
|
97
|
+
struct sockaddr_un addr;
|
|
98
|
+
|
|
99
|
+
if ((ctl->fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
|
|
100
|
+
LOG_ERROR(WARN,"socket()%s",strerror(errno));
|
|
101
|
+
return FALSE;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
setsocketoption(ctl->fd);
|
|
105
|
+
|
|
106
|
+
memset(&addr, 0, sizeof(addr));
|
|
107
|
+
addr.sun_family = AF_UNIX;
|
|
108
|
+
strcpy(addr.sun_path, w->tmp->ctl_path.str);
|
|
109
|
+
|
|
110
|
+
int len = sizeof(addr.sun_family)+strlen(addr.sun_path);
|
|
111
|
+
#ifdef __APPLE__
|
|
112
|
+
len ++;
|
|
113
|
+
#endif
|
|
114
|
+
|
|
115
|
+
LOG_DEBUG(DEBUG,"connect_to_head() connecting with socket %s",addr.sun_path);
|
|
116
|
+
if(connect(ctl->fd, (struct sockaddr *)&addr, len) < 0) {
|
|
117
|
+
LOG_ERROR(SEVERE,"Connect with controller fd failed: %s",strerror(errno));
|
|
118
|
+
return FALSE;
|
|
98
119
|
}
|
|
99
|
-
} else {
|
|
100
|
-
LOG_ERROR(SEVERE,"METHOD is missing");
|
|
101
120
|
}
|
|
121
|
+
return TRUE;
|
|
102
122
|
}
|
|
103
123
|
|
|
104
124
|
/** Send SCGI control message */
|
|
@@ -106,26 +126,27 @@ void ctl_write_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
106
126
|
LOG_FUNCTION
|
|
107
127
|
wkr_t* w = (wkr_t*) watcher->data;
|
|
108
128
|
wkr_ctl_t *ctl = w->ctl;
|
|
109
|
-
|
|
129
|
+
|
|
110
130
|
if(revents & EV_ERROR) {
|
|
111
131
|
ev_io_stop(loop, watcher);
|
|
112
132
|
LOG_ERROR(SEVERE,"Error writing control message :%s",strerror(errno));
|
|
113
|
-
|
|
133
|
+
is_alive = 0;
|
|
114
134
|
return;
|
|
115
135
|
}
|
|
116
136
|
if(scgi_send(ctl->scgi, watcher->fd) <= 0){
|
|
117
137
|
ev_io_stop(loop, watcher);
|
|
118
138
|
LOG_ERROR(SEVERE,"Error writing control message :%s",strerror(errno));
|
|
119
|
-
|
|
139
|
+
is_alive = 0;
|
|
120
140
|
return;
|
|
121
141
|
}
|
|
122
|
-
|
|
142
|
+
|
|
123
143
|
// Check message length
|
|
124
144
|
if(ctl->scgi->bytes_sent >= ctl->scgi->length) {
|
|
125
145
|
ev_io_stop(loop, watcher);
|
|
126
146
|
LOG_DEBUG(DEBUG, "ctl_write_cb() message sent successfully");
|
|
127
147
|
scgi_free(ctl->scgi);
|
|
128
148
|
ctl->scgi = NULL;
|
|
149
|
+
if(ctl->error == TRUE) is_alive = 0;
|
|
129
150
|
}
|
|
130
151
|
}
|
|
131
152
|
|
|
@@ -134,7 +155,7 @@ void ctl_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
134
155
|
LOG_FUNCTION
|
|
135
156
|
wkr_t* w = (wkr_t*) watcher->data;
|
|
136
157
|
wkr_ctl_t *ctl = w->ctl;
|
|
137
|
-
|
|
158
|
+
|
|
138
159
|
if(revents & EV_ERROR) {
|
|
139
160
|
ev_io_stop(loop, watcher);
|
|
140
161
|
is_alive = 0;
|
|
@@ -142,8 +163,8 @@ void ctl_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
142
163
|
return;
|
|
143
164
|
}
|
|
144
165
|
int bytesRead = recv(watcher->fd, ctl->msg + ctl->bytes_read,
|
|
145
|
-
|
|
146
|
-
|
|
166
|
+
STR_SIZE1KB - ctl->bytes_read, 0);
|
|
167
|
+
|
|
147
168
|
if(bytesRead <= 0) {
|
|
148
169
|
LOG_ERROR(SEVERE,"Error reading control message :%s",strerror(errno));
|
|
149
170
|
ev_io_stop(loop, watcher);
|
|
@@ -151,7 +172,7 @@ void ctl_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
151
172
|
return;
|
|
152
173
|
}
|
|
153
174
|
ctl->bytes_read += bytesRead;
|
|
154
|
-
|
|
175
|
+
|
|
155
176
|
int i;
|
|
156
177
|
for(i = 0 ; i < ctl->bytes_read ; i++) {
|
|
157
178
|
if(ctl->msg[i] == ':') {
|
|
@@ -162,9 +183,9 @@ void ctl_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
162
183
|
return;
|
|
163
184
|
ctl->msg_size = atoi(ctl->msg);
|
|
164
185
|
ctl->msg_size += (i+2);
|
|
165
|
-
|
|
186
|
+
|
|
166
187
|
scgi_t* ctl_req = NULL;
|
|
167
|
-
|
|
188
|
+
|
|
168
189
|
if(ctl->bytes_read >= ctl->msg_size) {
|
|
169
190
|
ctl_req = scgi_parse(ctl->msg, ctl->msg_size);
|
|
170
191
|
if(ctl_req == NULL ) {
|
|
@@ -178,109 +199,148 @@ void ctl_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
|
|
|
178
199
|
scgi_free(ctl_req);
|
|
179
200
|
return;
|
|
180
201
|
}
|
|
181
|
-
|
|
202
|
+
|
|
182
203
|
ctl->scgi = ctl_req;
|
|
183
|
-
ctl_msg_process(w)
|
|
184
|
-
|
|
204
|
+
if(ctl_msg_process(w) == TRUE){
|
|
205
|
+
scgi_free(ctl_req);
|
|
206
|
+
}else{
|
|
207
|
+
scgi_free(ctl_req);
|
|
208
|
+
is_alive = 0;
|
|
209
|
+
}
|
|
185
210
|
} else {
|
|
186
211
|
return;
|
|
187
212
|
}
|
|
188
|
-
|
|
213
|
+
|
|
189
214
|
ctl->bytes_read = ctl->msg_size = 0;
|
|
190
215
|
}
|
|
191
216
|
|
|
192
|
-
/**
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
struct sockaddr_in addr;
|
|
199
|
-
|
|
200
|
-
if ((ctl->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
|
201
|
-
LOG_ERROR(WARN,"socket():%s",strerror(errno));
|
|
202
|
-
return -1;
|
|
203
|
-
}
|
|
204
|
-
setsocketoption(ctl->fd);
|
|
205
|
-
LOG_DEBUG(DEBUG,"send_ack_on_internet_socket() FD for control.fd is %d",ctl->fd);
|
|
206
|
-
int iport = atoi(w->tmp->ctl_path.str);
|
|
207
|
-
addr.sin_family = AF_INET; // host byte order
|
|
208
|
-
addr.sin_port = htons(iport); // short, network byte order
|
|
209
|
-
addr.sin_addr.s_addr = htonl(INADDR_ANY); // auto-fill with my IP
|
|
210
|
-
memset(addr.sin_zero, '\0', sizeof addr.sin_zero);
|
|
217
|
+
/** Start control wathers */
|
|
218
|
+
void start_ctl_watcher(wkr_t *w){
|
|
219
|
+
ev_io_init(&(w->ctl->w_read),ctl_read_cb, w->ctl->fd, EV_READ);
|
|
220
|
+
ev_io_init(&(w->ctl->w_write),ctl_write_cb, w->ctl->fd, EV_WRITE);
|
|
221
|
+
ev_io_start(w->loop,&(w->ctl->w_read));
|
|
222
|
+
}
|
|
211
223
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return -1;
|
|
215
|
-
}
|
|
216
|
-
char buf[WR_SHORT_STR_LEN];
|
|
217
|
-
int len;
|
|
224
|
+
/** Set flag to TRUE to generate error request */
|
|
225
|
+
void get_worker_add_ctl_scgi(wkr_t* w, const int flag){
|
|
218
226
|
pid_t pid = getpid();
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
227
|
+
char buf[STR_SIZE32];
|
|
228
|
+
int len = sprintf(buf, "%d", pid);
|
|
229
|
+
|
|
230
|
+
scgi_t* scgi = w->ctl->scgi;
|
|
231
|
+
|
|
226
232
|
// Construct SCGI request
|
|
227
|
-
|
|
228
|
-
scgi_header_add(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
233
|
+
|
|
234
|
+
scgi_header_add(scgi, "COMPONENT", strlen("COMPONENT"), "WORKER", strlen("WORKER"));
|
|
235
|
+
|
|
236
|
+
if(flag == TRUE){
|
|
237
|
+
scgi_header_add(scgi, "METHOD", strlen("METHOD"), "ERROR", strlen("ERROR"));
|
|
238
|
+
}else{
|
|
239
|
+
scgi_header_add(scgi, "METHOD", strlen("METHOD"), "ADD", strlen("ADD"));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
scgi_header_add(scgi, "APPLICATION", strlen("APPLICATION"), w->tmp->name.str, w->tmp->name.len);
|
|
243
|
+
scgi_header_add(scgi, "PID", strlen("PID"), buf, len);
|
|
244
|
+
|
|
245
|
+
if(w->is_uds == 1) {
|
|
246
|
+
scgi_header_add(scgi, "UDS", strlen("UDS"), "YES", strlen("YES"));
|
|
247
|
+
scgi_header_add(scgi, "SOCK_PATH", strlen("SOCK_PATH"), w->sock_path.str, w->sock_path.len);
|
|
248
|
+
}else{
|
|
249
|
+
scgi_header_add(scgi, "UDS", strlen("UDS"), "NO", strlen("NO"));
|
|
250
|
+
len = sprintf(buf, "%d", w->listen_port);
|
|
251
|
+
scgi_header_add(scgi, "PORT", strlen("PORT"), buf, len);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
scgi_build(scgi);
|
|
248
255
|
}
|
|
249
256
|
|
|
250
|
-
/**
|
|
251
|
-
int
|
|
257
|
+
/** Process control message */
|
|
258
|
+
int ctl_msg_process(wkr_t* w) {
|
|
252
259
|
LOG_FUNCTION
|
|
253
|
-
LOG_DEBUG(DEBUG,"send_ack_on_unix_socket() path = %s", w->sock_path.str);
|
|
254
260
|
wkr_ctl_t *ctl = w->ctl;
|
|
255
|
-
|
|
261
|
+
char *value;
|
|
256
262
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
scgi_t* add_request = scgi_new();
|
|
260
|
-
if(add_request == NULL) {
|
|
261
|
-
LOG_ERROR(SEVERE,"Cannot create SCGI Request");
|
|
262
|
-
return -1;
|
|
263
|
-
}
|
|
263
|
+
scgi_t* ctl_req = ctl->scgi;
|
|
264
|
+
ctl->scgi = NULL;
|
|
264
265
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
266
|
+
value = (char*) scgi_header_value_get(ctl_req, "METHOD");
|
|
267
|
+
if(value) {
|
|
268
|
+
if(strcmp(value,"ADD")==0) {
|
|
269
|
+
// Response of ADD method
|
|
270
|
+
value = (char*) scgi_header_value_get(ctl_req, "STATUS");
|
|
271
|
+
if(value && strcmp(value, "OK")==0) {
|
|
272
|
+
LOG_INFO("Worker connected with Head.");
|
|
273
|
+
} else {
|
|
274
|
+
LOG_ERROR(SEVERE,"Unable to connect with Head.");
|
|
275
|
+
return FALSE;
|
|
276
|
+
}
|
|
277
|
+
} else if(strcmp(value,"REMOVE")==0) {
|
|
278
|
+
//Request to REMOVE worker
|
|
279
|
+
//TODO: need to send acknowledgement for clossing or not
|
|
280
|
+
/*scgi_t* ctl_resp = scgi_new();
|
|
281
|
+
if(ctl_resp){
|
|
282
|
+
scgi_header_add(ctl_resp, "METHOD", strlen("METHOD"), "REMOVE", strlen("REMOVE"));
|
|
283
|
+
scgi_header_add(ctl_resp, "STATUS", strlen("STATUS"), "OK", strlen("OK"));
|
|
284
|
+
scgi_build(ctl_resp);
|
|
285
|
+
send(control.fd, ctl_resp->request_buffer, ctl_resp->request_length, 0);
|
|
286
|
+
scgi_free(ctl_resp);
|
|
287
|
+
}*/
|
|
288
|
+
return FALSE;
|
|
289
|
+
} else if(strcmp(value,"PING") == 0) {
|
|
290
|
+
LOG_INFO("Worker got PING message");
|
|
291
|
+
scgi_t* ctl_resp = scgi_new();
|
|
292
|
+
if(ctl_resp) {
|
|
293
|
+
scgi_header_add(ctl_resp, "COMPONENT", strlen("COMPONENT"), "WORKER", strlen("WORKER"));
|
|
294
|
+
scgi_header_add(ctl_resp, "METHOD", strlen("METHOD"), "PING", strlen("PING"));
|
|
295
|
+
scgi_header_add(ctl_resp, "STATUS", strlen("STATUS"), "OK", strlen("OK"));
|
|
296
|
+
scgi_build(ctl_resp);
|
|
297
|
+
ctl->scgi = ctl_resp;
|
|
298
|
+
ev_io_start(w->loop, &ctl->w_write);
|
|
299
|
+
}
|
|
300
|
+
}else if(strcmp(value,"ACK") == 0) {
|
|
301
|
+
LOG_INFO("Worker got ACK message");
|
|
302
|
+
return FALSE;
|
|
303
|
+
}else if(strcmp(value,"CONF_REQ") == 0){
|
|
304
|
+
value = (char*) scgi_header_value_get(ctl_req, "STATUS");
|
|
305
|
+
if(value && strcmp(value, "OK") != 0) {
|
|
306
|
+
LOG_ERROR(SEVERE,"Did not receive application configuration.");
|
|
307
|
+
return FALSE;
|
|
308
|
+
}
|
|
309
|
+
//Application configuration received
|
|
310
|
+
application_config_read_cb(w, ctl_req);
|
|
311
|
+
}
|
|
312
|
+
} else {
|
|
313
|
+
LOG_ERROR(SEVERE,"METHOD is missing");
|
|
314
|
+
}
|
|
315
|
+
return TRUE;
|
|
316
|
+
}
|
|
273
317
|
|
|
274
|
-
|
|
318
|
+
/** Create config request message */
|
|
319
|
+
scgi_t* get_config_req_scgi(wkr_t* worker){
|
|
275
320
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
321
|
+
scgi_t* scgi = scgi_new();
|
|
322
|
+
if(scgi == NULL) {
|
|
323
|
+
LOG_ERROR(SEVERE,"Cannot create SCGI Request");
|
|
324
|
+
is_alive = 0;
|
|
325
|
+
return NULL;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Construct SCGI request
|
|
329
|
+
scgi_header_add(scgi, "COMPONENT", strlen("COMPONENT"), "WORKER", strlen("WORKER"));
|
|
330
|
+
scgi_header_add(scgi, "APPLICATION", strlen("APPLICATION"), worker->tmp->name.str, worker->tmp->name.len);
|
|
331
|
+
scgi_header_add(scgi, "METHOD", strlen("METHOD"), "CONF_REQ", strlen("CONF_REQ"));
|
|
332
|
+
scgi_build(scgi);
|
|
333
|
+
|
|
334
|
+
return scgi;
|
|
335
|
+
}
|
|
284
336
|
|
|
337
|
+
/** Send Config request control message */
|
|
338
|
+
int send_config_req_msg(wkr_t* w) {
|
|
339
|
+
LOG_FUNCTION
|
|
340
|
+
|
|
341
|
+
w->ctl->scgi = get_config_req_scgi(w);
|
|
342
|
+
if(w->ctl->scgi == NULL) return -1;
|
|
343
|
+
ev_io_start(w->loop,&(w->ctl->w_write));
|
|
344
|
+
|
|
285
345
|
return 0;
|
|
286
346
|
}
|
data/src/worker/wkr_http.c
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
#include <worker.h>
|
|
20
20
|
#include <ruby.h>
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
extern config_t *Config;
|
|
23
23
|
|
|
24
24
|
/** for handling of $0, courtesy http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/16221 */
|
|
25
25
|
static VALUE gProgName = Qnil;
|
|
@@ -41,7 +41,7 @@ static http_t *g_http;
|
|
|
41
41
|
/** Call 'Ruby' method 'RequestHandler.process' */
|
|
42
42
|
void http_req_process() {
|
|
43
43
|
LOG_FUNCTION
|
|
44
|
-
if(g_http->
|
|
44
|
+
if(g_http->stat){
|
|
45
45
|
static_file_process(g_http);
|
|
46
46
|
}else{
|
|
47
47
|
rb_funcall(cRequestHandler, rb_intern("process"),1,rb_req);
|
|
@@ -153,7 +153,7 @@ VALUE log_message(VALUE _, VALUE message_type, VALUE severity, VALUE message) {
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
/** for handling of $0 */
|
|
156
|
-
|
|
156
|
+
void setProgName(VALUE name, ID id) {
|
|
157
157
|
LOG_FUNCTION
|
|
158
158
|
gProgName = rb_obj_as_string(name);
|
|
159
159
|
rb_obj_taint(gProgName);
|
|
@@ -181,7 +181,7 @@ void init_ruby_interface(http_t *h) {
|
|
|
181
181
|
rb_define_hooked_variable("$0", &gProgName, 0, setProgName);
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
int init_ruby_interpreter(wkr_t *w) {
|
|
185
185
|
LOG_FUNCTION
|
|
186
186
|
//initializing ruby interpreter ... referred from main.c and ruby.c of ruby-dev
|
|
187
187
|
//preparing pseudo argc and argv to set ruby_option
|
|
@@ -202,13 +202,13 @@ static int init_ruby_interpreter(wkr_t *w) {
|
|
|
202
202
|
}
|
|
203
203
|
strcpy(v[0],"webroar-worker");
|
|
204
204
|
|
|
205
|
-
v[1] = (char*) malloc(sizeof(char)*(
|
|
205
|
+
v[1] = (char*) malloc(sizeof(char)*(Config->Worker.File.app_loader.len +1));
|
|
206
206
|
if(!v[1]) {
|
|
207
207
|
LOG_ERROR(WARN,"Memory allocation to pseudo argv failed.");
|
|
208
208
|
retval = -1;
|
|
209
209
|
goto err;
|
|
210
210
|
}
|
|
211
|
-
strcpy(v[1],
|
|
211
|
+
strcpy(v[1], Config->Worker.File.app_loader.str);
|
|
212
212
|
|
|
213
213
|
//RUBY_INIT_STACK;
|
|
214
214
|
ruby_init();
|
|
@@ -274,7 +274,7 @@ int load_rack_adapter(wkr_tmp_t *tmp) {
|
|
|
274
274
|
|
|
275
275
|
rb_gv_set("g_options",g_options);
|
|
276
276
|
|
|
277
|
-
rb_protect(RUBY_METHOD_FUNC(rb_require), (VALUE)
|
|
277
|
+
rb_protect(RUBY_METHOD_FUNC(rb_require), (VALUE)Config->Worker.File.app_loader.str, &state);
|
|
278
278
|
LOG_DEBUG(DEBUG, "state=%d", state);
|
|
279
279
|
if ( state != 0 ) {
|
|
280
280
|
LOG_ERROR(FATAL, "Some problem occurred while loading application.");
|
|
@@ -297,6 +297,7 @@ http_t* http_new(void *ptr) {
|
|
|
297
297
|
|
|
298
298
|
h->req = http_req_new();
|
|
299
299
|
h->resp = http_resp_new();
|
|
300
|
+
h->stat = NULL;
|
|
300
301
|
|
|
301
302
|
if(h->req==NULL || h->resp == NULL) {
|
|
302
303
|
http_free(&h);
|
|
@@ -304,11 +305,11 @@ http_t* http_new(void *ptr) {
|
|
|
304
305
|
}
|
|
305
306
|
|
|
306
307
|
if(w->tmp->is_static){
|
|
307
|
-
|
|
308
|
+
h->stat = static_server_new(w);
|
|
309
|
+
if(h->stat == NULL){
|
|
308
310
|
http_free(&h);
|
|
309
311
|
return NULL;
|
|
310
312
|
}
|
|
311
|
-
h->is_static = 1;
|
|
312
313
|
}else{
|
|
313
314
|
if(init_ruby_interpreter(w)!=0) {
|
|
314
315
|
http_free(&h);
|
|
@@ -321,7 +322,6 @@ http_t* http_new(void *ptr) {
|
|
|
321
322
|
return NULL;
|
|
322
323
|
}
|
|
323
324
|
rb_req = Data_Wrap_Struct(cReq, 0, 0, h->req);
|
|
324
|
-
h->is_static = 0;
|
|
325
325
|
}
|
|
326
326
|
g_http = h;
|
|
327
327
|
return h;
|
|
@@ -331,29 +331,15 @@ void http_free(http_t** http) {
|
|
|
331
331
|
LOG_FUNCTION
|
|
332
332
|
http_t *h = *http;
|
|
333
333
|
if(h) {
|
|
334
|
-
if(h->
|
|
335
|
-
static_module_free();
|
|
336
|
-
}else{
|
|
334
|
+
if(h->stat == NULL){
|
|
337
335
|
ruby_finalize();
|
|
338
336
|
}
|
|
339
337
|
|
|
340
|
-
if(h->resp)
|
|
341
|
-
|
|
342
|
-
if(h->
|
|
343
|
-
http_req_free(&h->req);
|
|
338
|
+
if(h->resp) http_resp_free(&h->resp);
|
|
339
|
+
if(h->req) http_req_free(&h->req);
|
|
340
|
+
if(h->stat) static_server_free(h->stat);
|
|
344
341
|
free(h);
|
|
345
342
|
}
|
|
346
343
|
*http = NULL;
|
|
347
344
|
}
|
|
348
345
|
|
|
349
|
-
void http_set(http_t* h) {
|
|
350
|
-
LOG_FUNCTION
|
|
351
|
-
if(h->resp)
|
|
352
|
-
http_resp_set(h->resp);
|
|
353
|
-
if(h->req)
|
|
354
|
-
http_req_set(h->req);
|
|
355
|
-
#ifdef L_DEBUG
|
|
356
|
-
|
|
357
|
-
h->conn_id = h->req_id = 0;
|
|
358
|
-
#endif
|
|
359
|
-
}
|
data/src/worker/wkr_http.h
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
#ifndef WKR_HTTP_H_
|
|
20
20
|
#define WKR_HTTP_H_
|
|
21
21
|
|
|
22
|
-
#include <
|
|
22
|
+
#include <wkr_static.h>
|
|
23
|
+
|
|
23
24
|
|
|
24
25
|
typedef struct http_s http_t;
|
|
25
26
|
|
|
@@ -28,16 +29,15 @@ struct http_s {
|
|
|
28
29
|
void *wkr;
|
|
29
30
|
http_req_t *req;
|
|
30
31
|
http_resp_t *resp;
|
|
31
|
-
|
|
32
|
-
#ifdef L_DEBUG
|
|
32
|
+
static_server_t *stat;
|
|
33
33
|
|
|
34
|
+
#ifdef L_DEBUG
|
|
34
35
|
wr_u_int conn_id;
|
|
35
36
|
wr_u_int req_id;
|
|
36
37
|
#endif
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
http_t* http_new(void *worker);
|
|
40
|
-
void http_set(http_t*);
|
|
41
41
|
void http_free(http_t**);
|
|
42
42
|
void http_req_process();
|
|
43
43
|
|