webroar 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG +48 -1
  2. data/README +11 -14
  3. data/Rakefile +1 -1
  4. data/conf/mime_type.yml +172 -166
  5. data/conf/server_internal_config.yml +30 -8
  6. data/doc/user-guide.html +294 -153
  7. data/doc/user-guide.txt +9 -13
  8. data/lib/command_runner.rb +1 -0
  9. data/lib/dependencies.rb +18 -15
  10. data/lib/installer.rb +115 -50
  11. data/src/admin_panel/app/controllers/admin_controller.rb +1 -15
  12. data/src/admin_panel/app/controllers/application_controller.rb +2 -2
  13. data/src/admin_panel/app/controllers/application_specification_controller.rb +2 -1
  14. data/src/admin_panel/app/controllers/headers_controller.rb +73 -0
  15. data/src/admin_panel/app/controllers/mail_specification_controller.rb +10 -0
  16. data/src/admin_panel/app/controllers/server_specification_controller.rb +14 -0
  17. data/src/admin_panel/app/helpers/admin_helper.rb +0 -85
  18. data/src/admin_panel/app/models/app.rb +1 -1
  19. data/src/admin_panel/app/models/application_specification.rb +33 -25
  20. data/src/admin_panel/app/models/headers.rb +116 -0
  21. data/src/admin_panel/app/models/mail_specification.rb +20 -5
  22. data/src/admin_panel/app/models/server_specification.rb +2 -7
  23. data/src/admin_panel/app/views/admin/configuration.html.erb +10 -5
  24. data/src/admin_panel/app/views/exceptions/_exception_list_partial.html.erb +4 -4
  25. data/src/admin_panel/app/views/graph/_graph_page.html.erb +3 -0
  26. data/src/admin_panel/app/views/headers/_add_expires_text_box.html.erb +35 -0
  27. data/src/admin_panel/app/views/headers/_expires_by_type_form.html.erb +65 -0
  28. data/src/admin_panel/app/views/headers/_headers_table.html.erb +113 -0
  29. data/src/admin_panel/app/views/mail_specification/_current_spec.html.erb +168 -0
  30. data/src/admin_panel/app/views/{admin → server_specification}/_add_div.html.erb +1 -1
  31. data/src/admin_panel/config/initializers/application_constants.rb +6 -0
  32. data/src/admin_panel/lib/control.rb +6 -3
  33. data/src/admin_panel/lib/scgi.rb +74 -21
  34. data/src/admin_panel/lib/yaml_writer.rb +51 -17
  35. data/src/admin_panel/public/javascripts/application.js +20 -1
  36. data/src/head/wr_access_log.c +2 -2
  37. data/src/head/wr_application.c +294 -236
  38. data/src/head/wr_application.h +8 -8
  39. data/src/head/wr_configurator.c +451 -517
  40. data/src/head/wr_configurator.h +10 -115
  41. data/src/head/wr_connection.c +26 -25
  42. data/src/head/wr_connection.h +2 -3
  43. data/src/head/wr_controller.c +110 -93
  44. data/src/head/wr_controller.h +6 -6
  45. data/src/head/wr_main.c +31 -24
  46. data/src/head/wr_request.c +70 -93
  47. data/src/head/wr_request.h +0 -4
  48. data/src/head/wr_resolver.c +21 -15
  49. data/src/head/wr_resolver.h +2 -2
  50. data/src/head/wr_server.c +36 -26
  51. data/src/head/wr_server.h +5 -5
  52. data/src/head/wr_worker.c +551 -512
  53. data/src/head/wr_worker.h +33 -20
  54. data/src/helper/wr_config.c +316 -0
  55. data/src/helper/wr_config.h +235 -0
  56. data/src/helper/wr_helper.h +1 -5
  57. data/src/helper/wr_logger.c +4 -4
  58. data/src/helper/wr_scgi.c +3 -4
  59. data/src/helper/wr_scgi.h +2 -0
  60. data/src/helper/wr_string.h +2 -2
  61. data/src/helper/wr_util.c +3 -1
  62. data/src/helper/wr_util.h +0 -0
  63. data/src/helper/wr_yaml_parser.c +30 -0
  64. data/src/helper/wr_yaml_parser.h +1 -0
  65. data/src/ruby_lib/exception_tracker/instrumentation/action_controller.rb +2 -1
  66. data/src/ruby_lib/mailer/smtpmail.rb +7 -4
  67. data/src/ruby_lib/profiler/instrumentation/action_controller.rb +2 -1
  68. data/src/ruby_lib/profiler/instrumentation/active_record.rb +3 -0
  69. data/src/ruby_lib/rack/adapter/rails.rb +14 -7
  70. data/src/ruby_lib/ruby_interface/client.rb +1 -1
  71. data/src/ruby_lib/ruby_interface/version.rb +2 -2
  72. data/src/ruby_lib/webroar_app_loader.rb +4 -2
  73. data/src/worker/wkr_controller.c +200 -140
  74. data/src/worker/wkr_http.c +14 -28
  75. data/src/worker/wkr_http.h +4 -4
  76. data/src/worker/wkr_http_request.c +12 -11
  77. data/src/worker/wkr_http_request.h +7 -8
  78. data/src/worker/wkr_http_response.c +10 -14
  79. data/src/worker/wkr_http_response.h +0 -1
  80. data/src/worker/wkr_main.c +74 -140
  81. data/src/worker/wkr_static.c +295 -108
  82. data/src/worker/wkr_static.h +20 -7
  83. data/src/worker/worker.c +245 -70
  84. data/src/worker/worker.h +46 -34
  85. data/tasks/compile.rake +128 -175
  86. data/tasks/test.rake +345 -469
  87. data/test/spec/webroar_command_spec.rb +23 -0
  88. metadata +173 -43
  89. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/README +0 -34
  90. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/Rakefile +0 -13
  91. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/init.rb +0 -5
  92. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/action_mailer_tls.rb +0 -16
  93. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/smtp_tls.rb +0 -123
  94. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/test/tls_test.rb +0 -42
  95. data/src/head/wr_config.h +0 -165
  96. data/src/ruby_lib/mailer/action_mailer_tls.rb +0 -16
  97. data/src/ruby_lib/mailer/smtp_tls.rb +0 -123
data/src/helper/wr_scgi.c CHANGED
@@ -28,7 +28,6 @@
28
28
  #include "wr_logger.h"
29
29
 
30
30
  #define SCGI_START_OFFSET 40
31
- #define SCGI_CONTENT_LENGTH "CONTENT_LENGTH"
32
31
  #define SCGI_CONTENT_LENGTH_LEN 14
33
32
 
34
33
  #define SCGI_HEADER_BLOCK_SIZE 2048
@@ -109,7 +108,7 @@ int scgi_header_add(scgi_t* scgi, const char* field, size_t field_len, const cha
109
108
  header->next = scgi->header_list;
110
109
  scgi->header_list = header;
111
110
 
112
- LOG_DEBUG(DEBUG, "%s:%s", scgi->header + header->field_offset, scgi->header + header->value_offset);
111
+ //LOG_DEBUG(DEBUG, "%s:%s", scgi->header + header->field_offset, scgi->header + header->value_offset);
113
112
 
114
113
  return 0;
115
114
  }
@@ -332,7 +331,7 @@ scgi_t* scgi_parse(const char *buffer, size_t length){
332
331
  state = STATE_HEADER;
333
332
  field_offset = i + 1;
334
333
  field_len = value_len = 0;
335
- LOG_DEBUG(DEBUG, "Header %s:%s", buffer + header->field_offset, buffer + header->value_offset);
334
+ //LOG_DEBUG(DEBUG, "Header %s:%s", buffer + header->field_offset, buffer + header->value_offset);
336
335
  }
337
336
  break;
338
337
  case STATE_BODY: // Process request body
@@ -421,4 +420,4 @@ scgi_header_t* scgi_header_get(scgi_t* scgi, const char *field){
421
420
  header = header->next;
422
421
  }
423
422
  return NULL;
424
- }
423
+ }
data/src/helper/wr_scgi.h CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  #include <stdio.h>
32
32
 
33
+ #define SCGI_CONTENT_LENGTH "CONTENT_LENGTH"
34
+
33
35
  typedef struct scgi_header_s scgi_header_t;
34
36
 
35
37
  /** SCGI request type */
@@ -36,8 +36,8 @@ typedef struct {
36
36
  #define wr_string_is_empty(_str) _str.str == NULL
37
37
  #define wr_string_new(_str,str1,_len) _str.len = _len; _str.str = (char*) malloc(sizeof(char)*(_len+1)); memcpy(_str.str, str1, _len); _str.str[_len] = 0
38
38
  #define wr_string_null(_str) _str.len = 0; _str.str = NULL
39
- #define wr_string_append(_str, str1, _len) char *str2 =(char*) realloc(_str.str,sizeof(char)*(_str.len+_len+1));\
40
- if(str2){memcpy(str2+_str.len, str1, _len); _str.len+=_len;str2[_str.len]=0;_str.str=str2;}
39
+ #define wr_string_append(_str, str1, _len) {char *str2 =(char*) realloc(_str.str,sizeof(char)*(_str.len+_len+1));\
40
+ if(str2){memcpy(str2+_str.len, str1, _len); _str.len+=_len;str2[_str.len]=0;_str.str=str2;}}
41
41
  #define wr_string_free(_str) if(_str.str) free(_str.str); _str.len = 0; _str.str = NULL
42
42
  #define wr_string_dump(_str,_str1) _str.len = _str1.len;_str.str = (char*) malloc(sizeof(char)*(_str.len+1)); memcpy(_str.str, _str1.str, _str.len); _str.str[_str.len] = 0
43
43
 
data/src/helper/wr_util.c CHANGED
@@ -138,7 +138,9 @@ time_t httpdate_to_c_time(const char *httpdate){
138
138
  //LOG_DEBUG(DEBUG,"Counld not parse httpdate %s.", httpdate);
139
139
  return -1;
140
140
  }
141
- return mktime(&tm_info);
141
+
142
+ //return mktime(&tm_info);
143
+ return timegm(&tm_info);
142
144
  }
143
145
 
144
146
  /** Convert C 'time_t' to HTTP date */
data/src/helper/wr_util.h CHANGED
File without changes
@@ -24,6 +24,7 @@
24
24
  #include <stdlib.h>
25
25
  #include <assert.h>
26
26
  #include <wr_yaml_parser.h>
27
+ #include <wr_logger.h>
27
28
 
28
29
  /** Free node */
29
30
  void node_free(node_t* node) {
@@ -247,3 +248,32 @@ node_t* yaml_parse(const char*file_name) {
247
248
  return NULL;
248
249
  }
249
250
  }
251
+
252
+ /** Validate YAML tokens */
253
+ char* wr_validate_string(const char* str) {
254
+ int count, len, is_blank, is_comment;
255
+
256
+ if(str == NULL)
257
+ return NULL;
258
+
259
+ //Set flags
260
+ is_blank = 1;
261
+ is_comment = 0;
262
+ len = strlen(str);
263
+ for(count = 0; count < len ; count++) {
264
+ //check for blank value
265
+ if(str[count] != ' ') {
266
+ is_blank = 0;
267
+ }
268
+ //check for comment '#' character
269
+ if(str[count] == '#') {
270
+ is_comment = 1;
271
+ break;
272
+ }
273
+ }
274
+ if(is_comment || is_blank) {
275
+ LOG_ERROR(SEVERE,"Invalid token.");
276
+ return NULL;
277
+ }
278
+ return (char*)str;
279
+ }
@@ -63,5 +63,6 @@ node_t* yaml_parse(const char*);
63
63
  node_t* get_nodes(node_t *root, char* xpath);
64
64
  char* get_node_value(node_t *root, char* xpath);
65
65
  void node_free(node_t* node);
66
+ char* wr_validate_string(const char* str);
66
67
 
67
68
  #endif /*WR_YAML_PARSER_H_*/
@@ -18,7 +18,8 @@
18
18
 
19
19
  module Webroar
20
20
  module ExceptionTracker
21
- trace_rescue_action(:rescue_action, ActionController::Rescue, 'i')
21
+ trace_rescue_action(:rescue_action, ActionController::Rescue, 'i') if ::Rails::VERSION::MAJOR < 3
22
+ trace_rescue_action(:rescue_with_handler, ActionController::Base, 'i') if ::Rails::VERSION::MAJOR > 2
22
23
  end # ExceptionTracker
23
24
  end # Webroar
24
25
 
@@ -40,20 +40,23 @@ module Email
40
40
  :password=>data['smtp']['password']}
41
41
  from = data['smtp']['from']
42
42
  recipients = data['smtp']['recipients']
43
- ActionMailer::Base.smtp_settings = details
44
- mail_configuration=true
43
+ ActionMailer::Base.smtp_settings = details
45
44
  else
46
45
  details ={:location=>data['sendmail']['location'],
47
46
  :arguments=>"-i -t -f"}
48
47
  from = data['sendmail']['from']
49
48
  recipients = data['sendmail']['recipients']
50
- ActionMailer::Base.sendmail_settings = details
51
- mail_configuration=true
49
+ ActionMailer::Base.sendmail_settings = details
52
50
  end
53
51
  rescue
54
52
  mail_configuration=false
55
53
  nil
56
54
  end
55
+ if data and data['email_notification'] and data['email_notification'].downcase == 'enabled'
56
+ mail_configuration = true
57
+ else
58
+ mail_configuration = false
59
+ end
57
60
  return from,recipients,mail_configuration
58
61
  end
59
62
  class EmailHandler < ActionMailer::Base
@@ -18,7 +18,8 @@
18
18
 
19
19
  module Webroar
20
20
  module Profiler
21
- trace_perform_action_equivalent(:perform_action, ActionController::Base, 'i')
21
+ trace_perform_action_equivalent(:perform_action, ActionController::Base, 'i') if ::Rails::VERSION::MAJOR < 3
22
+ trace_perform_action_equivalent(:process_action, ActionController::Base, 'i') if ::Rails::VERSION::MAJOR > 2
22
23
  trace_render_equivalent(:render, ActionController::Base, 'i')
23
24
  end # Profiler
24
25
  end # Webroar
@@ -22,6 +22,9 @@ module Webroar
22
22
  trace_database_method(:delete_all, ActiveRecord::Base, 'c')
23
23
  trace_database_method(:save, ActiveRecord::Base, 'i')
24
24
  trace_database_method(:destroy, ActiveRecord::Base, 'i')
25
+ trace_database_method(:all, ActiveRecord::Base, 'c') if ::Rails::VERSION::MAJOR > 2
26
+ trace_database_method(:first, ActiveRecord::Base, 'c') if ::Rails::VERSION::MAJOR > 2
27
+ trace_database_method(:last, ActiveRecord::Base, 'c') if ::Rails::VERSION::MAJOR > 2
25
28
 
26
29
  # Comment out following lines, if you not interested in detailed analysis of ActiveRecord Models
27
30
  # exclude_list = [Object, ActiveRecord::Base]
@@ -27,23 +27,30 @@ module Webroar
27
27
 
28
28
  @rails_app = if defined?(ActionController::Dispatcher) and ActionController::Dispatcher.instance_methods.include?('call')
29
29
  ActionController::Dispatcher.new
30
+ elsif ::Rails::VERSION::MAJOR >= 3
31
+ ::Rails.application
30
32
  else
31
33
  CgiApp.new
32
34
  end
33
35
 
34
- @file_server = ::Rack::File.new(::File.join(RAILS_ROOT, "public"))
36
+ @file_server = ::Rack::File.new(::File.join(@root, "public"))
35
37
  end
36
38
 
37
39
  def load_application
38
40
  ENV['RAILS_ENV'] = @env
39
41
 
40
42
  require "#{@root}/config/environment"
41
- require 'dispatcher'
42
- if ActionController::Base.respond_to?('relative_url_root=')
43
- ActionController::Base.relative_url_root = @prefix # new way to set the relative URL in Rails 2.1.1
44
- else
45
- ActionController::AbstractRequest.relative_url_root = @prefix
46
- end
43
+ # TODO: figure out way to set relative URL, following is not working on Rails3-beta4 for stylesheet_link_tag, javascript_include_tag
44
+ if ::Rails::VERSION::MAJOR >= 3
45
+ ::Rails.application.config.relative_url_root = @prefix
46
+ else
47
+ require 'dispatcher'
48
+ if ActionController::Base.respond_to?('relative_url_root=')
49
+ ActionController::Base.relative_url_root = @prefix # new way to set the relative URL in Rails 2.1.1
50
+ else
51
+ ActionController::AbstractRequest.relative_url_root = @prefix
52
+ end
53
+ end
47
54
  end
48
55
 
49
56
  # TODO refactor this in File#can_serve?(path) ??
@@ -21,7 +21,7 @@
21
21
  module Webroar
22
22
  class Client
23
23
  BASE_ENV = {
24
- SERVER_NAME => Webroar,
24
+ SERVER_NAME => WEBROAR,
25
25
  SCRIPT_NAME => EMPTY_STRING,
26
26
  QUERY_STRING => EMPTY_STRING,
27
27
  SERVER_SOFTWARE => Webroar::SERVER,
@@ -20,8 +20,8 @@ module Webroar
20
20
 
21
21
  module VERSION #:nodoc:
22
22
  MAJOR = "0"
23
- MINOR = "3"
24
- TINY = "1"
23
+ MINOR = "4"
24
+ TINY = "0"
25
25
 
26
26
  STRING = [MAJOR, MINOR, TINY].join('.')
27
27
  end
@@ -51,12 +51,14 @@ begin
51
51
  # STDERR.sync = true
52
52
  # puts '...........file opened..............'
53
53
  require File.join(File.dirname(__FILE__), 'profiler', 'message_dispatcher') #to send pid of worker
54
- if $pid_sent and $g_options["app_name"].strip != 'Admin Panel'
54
+ # TODO: Add Exception tracking for Rails 3
55
+ if $pid_sent and $g_options["app_name"].strip != 'Admin Panel' and $g_options["app_type"] == "rails"
55
56
  require File.join(File.dirname(__FILE__), 'exception_tracker', 'webroar_exception.rb')
56
57
  else
57
58
  Webroar.log_info("Exception notification would not work.")
58
59
  end
59
- if $g_options["app_profiling"] == "yes"
60
+ # TODO: Add profiling support for Rails 3
61
+ if $g_options["app_profiling"] == "yes" and $g_options["app_type"] == "rails"
60
62
  if $pid_sent
61
63
  require File.expand_path(File.join($g_options["webroar_root"], 'src', 'ruby_lib', 'profiler', 'webroar_profiling.rb'))
62
64
  else