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.
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