webroar 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/head/wr_request.c
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
static unsigned int wr_req_count = 0;
|
23
23
|
#define HTTP_PREFIX "HTTP_"
|
24
24
|
#define HTTP_PREFIX_LEN 5
|
25
|
-
|
25
|
+
extern config_t *Config;
|
26
26
|
/** Private function */
|
27
27
|
|
28
28
|
/** HTTP header received */
|
@@ -33,7 +33,7 @@ static unsigned int wr_req_count = 0;
|
|
33
33
|
*/
|
34
34
|
|
35
35
|
|
36
|
-
|
36
|
+
int wr_req_path_set(wr_req_t *req) {
|
37
37
|
LOG_FUNCTION
|
38
38
|
// terminate request uri with 'null' character
|
39
39
|
|
@@ -62,7 +62,7 @@ static inline int wr_req_path_set(wr_req_t *req) {
|
|
62
62
|
}
|
63
63
|
|
64
64
|
// Check Query String length
|
65
|
-
if(req->req_query_str.len >
|
65
|
+
if(req->req_query_str.len > Config->Request.max_query_size) {
|
66
66
|
LOG_DEBUG(DEBUG,"query str len = %d", req->req_query_str.len);
|
67
67
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request query string is too large.");
|
68
68
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
@@ -87,7 +87,7 @@ static inline int wr_req_path_set(wr_req_t *req) {
|
|
87
87
|
}
|
88
88
|
|
89
89
|
// Check request path length
|
90
|
-
if(req->req_path.len >
|
90
|
+
if(req->req_path.len > Config->Request.max_path_size) {
|
91
91
|
LOG_DEBUG(DEBUG,"req path len = %d", req->req_path.len);
|
92
92
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request path is too large.");
|
93
93
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
@@ -116,49 +116,22 @@ static inline int wr_req_path_set(wr_req_t *req) {
|
|
116
116
|
return 0;
|
117
117
|
}
|
118
118
|
|
119
|
-
|
120
|
-
static inline void wr_req_header_add(wr_req_t * req) {
|
121
|
-
int i = 5;
|
122
|
-
|
123
|
-
if(req->scgi->request_headers_len+1 > WR_MAX_REQ_HEADER_LEN) {
|
124
|
-
req->resp_buf_len = sprintf(req->resp_buf,"%s","The number of request headers is too large.");
|
125
|
-
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
126
|
-
return;
|
127
|
-
}
|
128
|
-
|
129
|
-
for( ; i < req->tmp_header.len ; i++) {
|
130
|
-
req->tmp_header.str[i] = (req->tmp_header.str[i]=='-' ? '_' : wr_toupper(req->tmp_header.str[i]));
|
131
|
-
}
|
132
|
-
|
133
|
-
LOG_DEBUG(DEBUG, "%s() header=%s, value=%s", __FUNCTION__, req->tmp_header.str, req->tmp_value.str);
|
134
|
-
|
135
|
-
scgiUEST_HEADER_SET(req->scgi,
|
136
|
-
req->tmp_header.str, req->tmp_header.len,
|
137
|
-
req->tmp_value.str, req->tmp_value.len);
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
wr_string_null(req->tmp_value);
|
142
|
-
wr_string_null(req->tmp_header);
|
143
|
-
}
|
144
|
-
*/
|
145
|
-
|
146
|
-
static int wr_req_header_length_check(wr_req_t *req, size_t length, int index){
|
119
|
+
int wr_req_header_length_check(wr_req_t *req, size_t length, int index){
|
147
120
|
// Check no. of headers
|
148
|
-
if(index >=
|
121
|
+
if(index >= Config->Request.max_header_count) {
|
149
122
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The number of request header is too large.");
|
150
123
|
return WR_HTTP_STATUS_413;
|
151
124
|
}
|
152
125
|
|
153
126
|
// Check field length
|
154
127
|
if(req->scgi->index == index){
|
155
|
-
if(req->scgi->header_list->field_length + length >
|
128
|
+
if(req->scgi->header_list->field_length + length > Config->Request.max_field_size){
|
156
129
|
LOG_DEBUG(DEBUG,"header len = %d", req->scgi->header_list->field_length);
|
157
130
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The request field name is too large.");
|
158
131
|
return WR_HTTP_STATUS_413;
|
159
132
|
}
|
160
133
|
}else{
|
161
|
-
if((length + 5) >
|
134
|
+
if((length + 5) > Config->Request.max_field_size){
|
162
135
|
LOG_DEBUG(DEBUG,"header len = %d", length + 5);
|
163
136
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The request field name is too large.");
|
164
137
|
return WR_HTTP_STATUS_413;
|
@@ -169,7 +142,7 @@ static int wr_req_header_length_check(wr_req_t *req, size_t length, int index){
|
|
169
142
|
}
|
170
143
|
|
171
144
|
// Check request size
|
172
|
-
if((req->scgi->header_offset + length) >
|
145
|
+
if((req->scgi->header_offset + length) > Config->Request.max_header_size) {
|
173
146
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request is too large.");
|
174
147
|
return WR_HTTP_STATUS_413;
|
175
148
|
}
|
@@ -187,19 +160,19 @@ void wr_req_header_field_cb(ebb_request* request, const char *at, size_t length,
|
|
187
160
|
|
188
161
|
scgi_header_field_add(req->scgi, at, length, header_index);
|
189
162
|
|
190
|
-
LOG_DEBUG(DEBUG,"field name = %s",req->scgi->header + req->scgi->header_list->field_offset);
|
163
|
+
//LOG_DEBUG(DEBUG,"field name = %s",req->scgi->header + req->scgi->header_list->field_offset);
|
191
164
|
}
|
192
165
|
|
193
|
-
|
166
|
+
int wr_req_header_value_check(wr_req_t *req, size_t length, int index){
|
194
167
|
// Check value length
|
195
168
|
if(req->scgi->index == index){
|
196
|
-
if(req->scgi->header_list->value_length + length >
|
169
|
+
if(req->scgi->header_list->value_length + length > Config->Request.max_value_size){
|
197
170
|
LOG_DEBUG(DEBUG,"value len = %d", req->scgi->header_list->value_length);
|
198
171
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The request field value is too large.");
|
199
172
|
return WR_HTTP_STATUS_413;
|
200
173
|
}
|
201
174
|
}else{
|
202
|
-
if(length >
|
175
|
+
if(length > Config->Request.max_value_size){
|
203
176
|
LOG_DEBUG(DEBUG,"value len = %d", length + 5);
|
204
177
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The request field value is too large.");
|
205
178
|
return WR_HTTP_STATUS_413;
|
@@ -207,7 +180,7 @@ static int wr_req_header_value_check(wr_req_t *req, size_t length, int index){
|
|
207
180
|
}
|
208
181
|
|
209
182
|
// Check request size
|
210
|
-
if((req->scgi->header_offset + length) >
|
183
|
+
if((req->scgi->header_offset + length) > Config->Request.max_header_size) {
|
211
184
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request is too large.");
|
212
185
|
return WR_HTTP_STATUS_413;
|
213
186
|
}
|
@@ -226,7 +199,7 @@ void wr_req_header_value_cb(ebb_request* request, const char *at, size_t length,
|
|
226
199
|
|
227
200
|
scgi_header_value_add(req->scgi, at, length, header_index);
|
228
201
|
|
229
|
-
LOG_DEBUG(DEBUG,"field value = %s",req->scgi->header + req->scgi->header_list->value_offset);
|
202
|
+
//LOG_DEBUG(DEBUG,"field value = %s",req->scgi->header + req->scgi->header_list->value_offset);
|
230
203
|
}
|
231
204
|
|
232
205
|
/** HTTP Request path received */
|
@@ -236,7 +209,7 @@ void wr_req_path_cb(ebb_request* request, const char *at, size_t length) {
|
|
236
209
|
req->req_path.len += length;
|
237
210
|
|
238
211
|
// Check request path length
|
239
|
-
if(req->req_path.len >
|
212
|
+
if(req->req_path.len > Config->Request.max_path_size) {
|
240
213
|
LOG_DEBUG(DEBUG,"req path len = %d", req->req_path.len);
|
241
214
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request path is too large.");
|
242
215
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
@@ -251,7 +224,7 @@ void wr_query_string_cb(ebb_request* request, const char *at, size_t length) {
|
|
251
224
|
req->req_query_str.len += length;
|
252
225
|
|
253
226
|
// Check query string size
|
254
|
-
if(req->req_query_str.len >
|
227
|
+
if(req->req_query_str.len > Config->Request.max_query_size) {
|
255
228
|
LOG_DEBUG(DEBUG,"query str len = %d", req->req_query_str.len);
|
256
229
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request query string is too large.");
|
257
230
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
@@ -264,7 +237,7 @@ void wr_req_uri_cb(ebb_request* request, const char *at, size_t length) {
|
|
264
237
|
LOG_FUNCTION
|
265
238
|
wr_req_t* req =(wr_req_t*) request->data;
|
266
239
|
|
267
|
-
if(req->req_uri.len + length >
|
240
|
+
if(req->req_uri.len + length > Config->Request.max_uri_size) {
|
268
241
|
LOG_DEBUG(DEBUG,"req uri len = %d",__FUNCTION__, req->req_uri.len);
|
269
242
|
req->resp_buf_len = sprintf(req->resp_buf,"%s","The request URI is too large.");
|
270
243
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_414);
|
@@ -285,7 +258,7 @@ void wr_req_fragment_cb(ebb_request* request, const char *at, size_t length) {
|
|
285
258
|
|
286
259
|
// Check request path length
|
287
260
|
LOG_DEBUG(DEBUG,"Fragment length = %d", req->req_fragment.len + length);
|
288
|
-
if((req->req_fragment.len + length) >
|
261
|
+
if((req->req_fragment.len + length) > Config->Request.max_frag_size) {
|
289
262
|
LOG_DEBUG(DEBUG,"req fragment len = %d", length);
|
290
263
|
req->resp_buf_len = sprintf(req->resp_buf, "%s", "The request fragment is too large.");
|
291
264
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_413);
|
@@ -299,6 +272,22 @@ void wr_req_fragment_cb(ebb_request* request, const char *at, size_t length) {
|
|
299
272
|
}
|
300
273
|
}
|
301
274
|
|
275
|
+
/** Add req request body */
|
276
|
+
int wr_req_body_add(wr_req_t *req, const char *at, size_t length) {
|
277
|
+
LOG_FUNCTION
|
278
|
+
if(req->upload_file) {
|
279
|
+
LOG_DEBUG(DEBUG, "writing into file");
|
280
|
+
size_t write = 0;
|
281
|
+
while(write < length) {
|
282
|
+
write += fwrite( at + write, sizeof(char), length - write, req->upload_file);
|
283
|
+
}
|
284
|
+
} else {
|
285
|
+
LOG_DEBUG(DEBUG, "copying into buffer. len=%d", length);
|
286
|
+
scgi_body_add(req->scgi, at, length);
|
287
|
+
}
|
288
|
+
return 0;
|
289
|
+
}
|
290
|
+
|
302
291
|
/** Request body received */
|
303
292
|
void wr_req_body_cb(ebb_request* request, const char *at, size_t length) {
|
304
293
|
LOG_FUNCTION
|
@@ -429,17 +418,17 @@ void wr_headers_complete_cb(ebb_request * request) {
|
|
429
418
|
/* Add WR_EBB_HTTP_VER header into CGI header list */
|
430
419
|
wr_buffer_t *buf;
|
431
420
|
wr_buffer_new(buf);
|
432
|
-
wr_buffer_create(buf,
|
433
|
-
buf->len = snprintf(buf->str,
|
421
|
+
wr_buffer_create(buf, STR_SIZE16);
|
422
|
+
buf->len = snprintf(buf->str, STR_SIZE16, "HTTP/%d.%d", request->version_major, request->version_minor);
|
434
423
|
scgi_header_add(req->scgi, WR_EBB_HTTP_VER, WR_EBB_HTTP_VER_LEN, buf->str, buf->len);
|
435
424
|
wr_buffer_free(buf);
|
436
425
|
|
437
426
|
/** Check content length */
|
438
427
|
LOG_DEBUG(DEBUG,"Request content len = %d", request->content_length);
|
439
|
-
if(request->content_length >
|
428
|
+
if(request->content_length > Config->Request.max_body_size) {
|
440
429
|
// Open file to write req request body
|
441
430
|
wr_buffer_new(req->upload_file_name);
|
442
|
-
wr_buffer_create(req->upload_file_name,
|
431
|
+
wr_buffer_create(req->upload_file_name, STR_SIZE32);
|
443
432
|
req->upload_file_name->len = sprintf(req->upload_file_name->str,"/tmp/ebb_upload_%d", req->id);
|
444
433
|
req->upload_file = fopen(req->upload_file_name->str,"w+");
|
445
434
|
if(req->upload_file == NULL) {
|
@@ -475,74 +464,73 @@ void wr_req_complete_cb(ebb_request * request) {
|
|
475
464
|
WR_QUEUE_INSERT(req->app->q_messages, req, rv)
|
476
465
|
if(rv == 0){
|
477
466
|
wr_wkr_dispatch_req(req);
|
478
|
-
|
467
|
+
}else{
|
468
|
+
LOG_ERROR(WARN,"Application pending message queue overflow.", req->id, req->req_uri.str);
|
469
|
+
wr_req_invalid(req->conn, WR_HTTP_STATUS_503);
|
479
470
|
}
|
471
|
+
return;
|
480
472
|
}
|
481
473
|
LOG_ERROR(WARN,"Failed to dispatch req no %d to any application. Request PATH is %s", req->id, req->req_uri.str);
|
482
474
|
wr_req_invalid(req->conn, WR_HTTP_STATUS_404);
|
483
475
|
}
|
484
476
|
|
485
|
-
/********************************************************
|
486
|
-
* Request Function Definition *
|
487
|
-
********************************************************/
|
488
|
-
|
489
477
|
/** Create new Request */
|
490
478
|
wr_req_t* wr_req_new(wr_conn_t* conn) {
|
491
479
|
LOG_FUNCTION
|
492
480
|
LOG_DEBUG(DEBUG,"for connection = %d", conn->id);
|
493
|
-
|
481
|
+
|
494
482
|
wr_req_t *req = wr_malloc(wr_req_t);
|
495
|
-
|
483
|
+
|
496
484
|
if(req == NULL) {
|
497
485
|
LOG_DEBUG(SEVERE, "Error req is null. Returning ...");
|
498
486
|
return NULL;
|
499
487
|
}
|
500
|
-
|
488
|
+
|
501
489
|
req->conn = conn;
|
502
490
|
req->id = ++wr_req_count;
|
503
|
-
|
491
|
+
|
504
492
|
req->app = NULL;
|
505
493
|
req->wkr = NULL;
|
506
|
-
|
494
|
+
|
507
495
|
req->upload_file = NULL;
|
508
496
|
req->upload_file_name = NULL;
|
509
497
|
// req->uri_hash =
|
510
498
|
req->bytes_sent = 0;
|
511
499
|
req->scgi = scgi_new();
|
512
|
-
|
500
|
+
|
513
501
|
if(req->scgi == NULL) {
|
514
502
|
free(req);
|
515
503
|
LOG_ERROR(WARN, "Error req->scgi is null. Returning ...");
|
516
504
|
return NULL;
|
517
505
|
}
|
518
|
-
|
506
|
+
|
519
507
|
req->resp_buf_len =
|
520
|
-
|
521
|
-
|
508
|
+
req->bytes_received =
|
509
|
+
req->resp_body_len = 0;
|
522
510
|
req->resp_code = 0;
|
523
|
-
|
511
|
+
|
524
512
|
req->conn_err = req->using_wkr = FALSE;
|
525
|
-
|
513
|
+
|
526
514
|
#ifdef L_DEBUG
|
527
515
|
/* Adding Connection id and req id */
|
528
516
|
wr_buffer_t *conn_id, *req_id;
|
529
517
|
wr_buffer_new(conn_id);
|
530
518
|
wr_buffer_new(req_id);
|
531
|
-
wr_buffer_create(conn_id,
|
532
|
-
wr_buffer_create(req_id,
|
519
|
+
wr_buffer_create(conn_id, STR_SIZE32);
|
520
|
+
wr_buffer_create(req_id, STR_SIZE32);
|
533
521
|
conn_id->len = snprintf(conn_id->str, conn_id->size, "%d", conn->id);
|
534
522
|
req_id->len = snprintf(req_id->str, req_id->size, "%d", req->id);
|
535
|
-
scgi_header_add(req->scgi,
|
536
|
-
scgi_header_add(req->scgi,
|
523
|
+
scgi_header_add(req->scgi, Config->Request.Header.conn_id.str, Config->Request.Header.conn_id.len, conn_id->str, conn_id->len);
|
524
|
+
scgi_header_add(req->scgi, Config->Request.Header.req_id.str, Config->Request.Header.req_id.len, req_id->str, req_id->len);
|
537
525
|
wr_buffer_free(conn_id);
|
538
526
|
wr_buffer_free(req_id);
|
539
527
|
#endif
|
540
|
-
|
528
|
+
|
541
529
|
wr_string_null(req->req_uri);
|
542
530
|
wr_string_null(req->req_path);
|
543
531
|
wr_string_null(req->req_query_str);
|
544
532
|
wr_string_null(req->req_fragment);
|
545
|
-
|
533
|
+
|
546
534
|
ebb_request *request = wr_malloc(ebb_request);
|
547
535
|
if(request == NULL) {
|
548
536
|
scgi_free(req->scgi);
|
@@ -550,12 +538,12 @@ wr_req_t* wr_req_new(wr_conn_t* conn) {
|
|
550
538
|
LOG_DEBUG(SEVERE, "Error ebb_request is null. Returning ...");
|
551
539
|
return NULL;
|
552
540
|
}
|
553
|
-
|
541
|
+
|
554
542
|
ebb_request_init(request);
|
555
|
-
|
543
|
+
|
556
544
|
//TODO: can connection have multiple requests?
|
557
545
|
req->ebb_req = request;
|
558
|
-
|
546
|
+
|
559
547
|
request->data = req;
|
560
548
|
request->on_path = wr_req_path_cb;
|
561
549
|
request->on_query_string = wr_query_string_cb;
|
@@ -566,13 +554,18 @@ wr_req_t* wr_req_new(wr_conn_t* conn) {
|
|
566
554
|
request->on_headers_complete = wr_headers_complete_cb;
|
567
555
|
request->on_body = wr_req_body_cb;
|
568
556
|
request->on_complete = wr_req_complete_cb;
|
569
|
-
|
557
|
+
|
570
558
|
//TODO: Check for keep alive status & then increment 'responses_to_write'
|
571
559
|
// Else it will be 1
|
572
|
-
|
560
|
+
|
573
561
|
return req;
|
574
562
|
}
|
575
563
|
|
564
|
+
|
565
|
+
/********************************************************
|
566
|
+
* Request Function Definition *
|
567
|
+
********************************************************/
|
568
|
+
|
576
569
|
/** Destroy req */
|
577
570
|
void wr_req_free(wr_req_t* req) {
|
578
571
|
LOG_FUNCTION
|
@@ -604,22 +597,6 @@ void wr_req_free(wr_req_t* req) {
|
|
604
597
|
}
|
605
598
|
}
|
606
599
|
|
607
|
-
/** Add req request body */
|
608
|
-
int wr_req_body_add(wr_req_t *req, const char *at, size_t length) {
|
609
|
-
LOG_FUNCTION
|
610
|
-
if(req->upload_file) {
|
611
|
-
LOG_DEBUG(DEBUG, "writing into file");
|
612
|
-
size_t write = 0;
|
613
|
-
while(write < length) {
|
614
|
-
write += fwrite( at + write, sizeof(char), length - write, req->upload_file);
|
615
|
-
}
|
616
|
-
} else {
|
617
|
-
LOG_DEBUG(DEBUG, "copying into buffer. len=%d", length);
|
618
|
-
scgi_body_add(req->scgi, at, length);
|
619
|
-
}
|
620
|
-
return 0;
|
621
|
-
}
|
622
|
-
|
623
600
|
ebb_request* wr_new_req_cb(ebb_connection *connection) {
|
624
601
|
LOG_FUNCTION
|
625
602
|
// Create new wr_req
|
data/src/head/wr_request.h
CHANGED
@@ -52,12 +52,8 @@ struct wr_req_s {
|
|
52
52
|
size_t bytes_received;
|
53
53
|
};
|
54
54
|
|
55
|
-
/** Create new Request */
|
56
|
-
wr_req_t* wr_req_new(wr_conn_t*);
|
57
55
|
/** Destroy Request */
|
58
56
|
void wr_req_free(wr_req_t*);
|
59
|
-
/** Add Request body */
|
60
|
-
int wr_req_body_add(wr_req_t*, const char*, size_t);
|
61
57
|
/** Invalid request */
|
62
58
|
void wr_req_invalid(wr_conn_t *, wr_resp_status_t);
|
63
59
|
/** Allocates and initializes ab ebb_request */
|
data/src/head/wr_resolver.c
CHANGED
@@ -19,6 +19,8 @@
|
|
19
19
|
#include <wr_request.h>
|
20
20
|
#include <string.h>
|
21
21
|
|
22
|
+
extern config_t *Config;
|
23
|
+
|
22
24
|
/*********** Private Function ***********/
|
23
25
|
void wr_req_resolver_print(wr_req_resolver_t* resolver) {
|
24
26
|
LOG_FUNCTION
|
@@ -41,15 +43,19 @@ void wr_req_resolver_print(wr_req_resolver_t* resolver) {
|
|
41
43
|
}
|
42
44
|
|
43
45
|
/** Resolve static content */
|
46
|
+
/* Do not set req->app if static workers are not there.
|
47
|
+
* If req->app does not set, the static content served by the worker of
|
48
|
+
* respective application */
|
44
49
|
int wr_req_resolve_static_content(wr_req_t *req){
|
45
50
|
LOG_FUNCTION
|
46
|
-
char path[
|
51
|
+
char path[STR_SIZE1KB + Config->Request.max_path_size];
|
47
52
|
char *req_path;
|
48
53
|
struct stat buf;
|
49
54
|
int len;
|
50
55
|
wr_str_t decoded_req_path;
|
51
56
|
|
52
|
-
|
57
|
+
// Check static-workers exist or not
|
58
|
+
if(req->app->svr->static_app == NULL || WR_QUEUE_SIZE(req->app->svr->static_app->q_workers) <= 0){
|
53
59
|
LOG_ERROR(SEVERE,"Static content server is down.")
|
54
60
|
return -1;
|
55
61
|
}
|
@@ -77,7 +83,7 @@ int wr_req_resolve_static_content(wr_req_t *req){
|
|
77
83
|
|
78
84
|
/* Add WR_FILE_PATH header into SCGI header list */
|
79
85
|
LOG_DEBUG(DEBUG, "File path = %s, lenght = %d", path, strlen(path));
|
80
|
-
scgi_header_add(req->scgi,
|
86
|
+
scgi_header_add(req->scgi, Config->Request.Header.file_path.str, Config->Request.Header.file_path.len, path, strlen(path));
|
81
87
|
req->app = req->app->svr->static_app;
|
82
88
|
|
83
89
|
return 0;
|
@@ -99,20 +105,20 @@ wr_req_resolver_t* wr_req_resolver_new() {
|
|
99
105
|
}
|
100
106
|
|
101
107
|
/** Add Application resolver */
|
102
|
-
int wr_req_resolver_add(wr_svr_t *server, wr_app_t *app
|
108
|
+
int wr_req_resolver_add(wr_svr_t *server, wr_app_t *app) {
|
103
109
|
LOG_FUNCTION
|
104
110
|
short rv = 0;
|
105
111
|
|
106
|
-
if(conf->baseuri.str) {
|
107
|
-
LOG_DEBUG(DEBUG, "Adding resolver baseuri = %s",conf->baseuri.str);
|
112
|
+
if(app->conf->baseuri.str) {
|
113
|
+
LOG_DEBUG(DEBUG, "Adding resolver baseuri = %s",app->conf->baseuri.str);
|
108
114
|
wr_baseuri_t *baseuri = wr_malloc(wr_baseuri_t);
|
109
115
|
if(baseuri == NULL) {
|
110
116
|
rv = -1;
|
111
117
|
}
|
112
118
|
|
113
|
-
baseuri->baseuri_hash = uri_hash(conf->baseuri.str + 1);
|
119
|
+
baseuri->baseuri_hash = uri_hash(app->conf->baseuri.str + 1);
|
114
120
|
|
115
|
-
if(baseuri->baseuri_hash ==
|
121
|
+
if(baseuri->baseuri_hash == Config->Request.prefix_hash) {
|
116
122
|
free(baseuri);
|
117
123
|
server->default_app = app;
|
118
124
|
} else {
|
@@ -129,8 +135,8 @@ int wr_req_resolver_add(wr_svr_t *server, wr_app_t *app, wr_app_conf_t *conf) {
|
|
129
135
|
* Host name start and end with '*'
|
130
136
|
*/
|
131
137
|
|
132
|
-
if(conf->host_name_list) {
|
133
|
-
|
138
|
+
if(app->conf->host_name_list) {
|
139
|
+
config_host_list_t *host = app->conf->host_name_list;
|
134
140
|
while(host) {
|
135
141
|
LOG_DEBUG(DEBUG, "Adding resolver Host = %s, type=%d",host->name.str, host->type);
|
136
142
|
wr_host_list_t *list = wr_malloc(wr_host_list_t);
|
@@ -180,7 +186,7 @@ int wr_req_resolver_remove(wr_svr_t *server, wr_app_t *app) {
|
|
180
186
|
while(baseuri) {
|
181
187
|
if(baseuri->app == app) {
|
182
188
|
LOG_DEBUG(DEBUG,"Removed application %s",baseuri->app->conf->baseuri.str);
|
183
|
-
// if(baseuri->baseuri_hash ==
|
189
|
+
// if(baseuri->baseuri_hash == Config->Request.prefix_hash){
|
184
190
|
// server->default_app = NULL;
|
185
191
|
// }
|
186
192
|
if(prev_baseuri == NULL) {
|
@@ -260,25 +266,25 @@ int wr_req_resolve_http_req(wr_svr_t *server, wr_req_t *req) {
|
|
260
266
|
}
|
261
267
|
|
262
268
|
while(list) {
|
263
|
-
if(list->host->type ==
|
269
|
+
if(list->host->type == HOST_TYPE_STATIC &&
|
264
270
|
list->host->name.len == host_str.len &&
|
265
271
|
strncmp(list->host->name.str, host_str.str, host_str.len)==0) {
|
266
272
|
LOG_DEBUG(DEBUG,"Application resolved with WR_HOST_TYPE_STATIC host %s", list->host->name.str);
|
267
273
|
app = list->app;
|
268
274
|
break;
|
269
|
-
} else if(list->host->type ==
|
275
|
+
} else if(list->host->type == HOST_TYPE_WILDCARD_IN_START &&
|
270
276
|
list->host->name.len < host_str.len &&
|
271
277
|
strncmp(list->host->name.str, host_str.str + host_str.len - list->host->name.len, list->host->name.len)==0) {
|
272
278
|
LOG_DEBUG(DEBUG,"Application resolved with WR_HOST_TYPE_WILDCARD_IN_START host %s", list->host->name.str);
|
273
279
|
app = list->app;
|
274
280
|
break;
|
275
|
-
} else if(list->host->type ==
|
281
|
+
} else if(list->host->type == HOST_TYPE_WILDCARD_IN_END &&
|
276
282
|
list->host->name.len < host_str.len &&
|
277
283
|
strncmp(list->host->name.str, host_str.str, list->host->name.len)==0) {
|
278
284
|
LOG_DEBUG(DEBUG,"Application resolved with WR_HOST_TYPE_WILDCARD_IN_END host %s", list->host->name.str);
|
279
285
|
app = list->app;
|
280
286
|
break;
|
281
|
-
} else if(list->host->type ==
|
287
|
+
} else if(list->host->type == HOST_TYPE_WILDCARD_IN_START_END &&
|
282
288
|
list->host->name.len < host_str.len &&
|
283
289
|
strstr(host_str.str, list->host->name.str)!=NULL) {
|
284
290
|
LOG_DEBUG(DEBUG,"Application resolved with WR_HOST_TYPE_WILDCARD_IN_START_END host %s", list->host->name.str);
|
data/src/head/wr_resolver.h
CHANGED
@@ -31,7 +31,7 @@ typedef struct wr_host_list_s wr_host_list_t;
|
|
31
31
|
* Host name start and end with '*'
|
32
32
|
*/
|
33
33
|
struct wr_host_list_s {
|
34
|
-
|
34
|
+
config_host_list_t *host;
|
35
35
|
wr_app_t *app;
|
36
36
|
wr_host_list_t *next;
|
37
37
|
};
|
@@ -50,7 +50,7 @@ struct wr_req_resolver_s {
|
|
50
50
|
};
|
51
51
|
|
52
52
|
wr_req_resolver_t* wr_req_resolver_new();
|
53
|
-
int wr_req_resolver_add(wr_svr_t*, wr_app_t
|
53
|
+
int wr_req_resolver_add(wr_svr_t*, wr_app_t*);
|
54
54
|
int wr_req_resolver_remove(wr_svr_t*, wr_app_t*);
|
55
55
|
int wr_req_resolve_http_req(wr_svr_t*, wr_req_t*);
|
56
56
|
void wr_req_resolver_free(wr_req_resolver_t*);
|