webroar 0.2.5 → 0.2.6

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 (57) hide show
  1. data/CHANGELOG +34 -0
  2. data/lib/dependencies.rb +9 -7
  3. data/lib/installer.rb +46 -18
  4. data/src/admin_panel/app/controllers/graph_controller.rb +2 -2
  5. data/src/admin_panel/app/views/graph/_javascript_partial.html.erb +1 -0
  6. data/src/admin_panel/lib/yaml_writer.rb +1 -1
  7. data/src/head/wr_application.c +2 -3
  8. data/src/head/wr_application.h +2 -2
  9. data/src/head/wr_config.h +2 -1
  10. data/src/head/wr_configurator.c +3 -10
  11. data/src/head/wr_connection.c +11 -10
  12. data/src/head/wr_controller.c +2 -6
  13. data/src/head/wr_main.c +2 -2
  14. data/src/head/wr_request.c +2 -5
  15. data/src/head/wr_resolver.c +2 -2
  16. data/src/head/wr_server.c +0 -2
  17. data/src/head/wr_worker.c +0 -4
  18. data/src/helper/wr_logger.c +5 -8
  19. data/src/helper/wr_logger.h +2 -2
  20. data/src/helper/wr_yaml_parser.c +1 -1
  21. data/src/ruby_lib/ruby_interface/client.rb +9 -2
  22. data/src/ruby_lib/ruby_interface/constants.rb +1 -0
  23. data/src/ruby_lib/ruby_interface/deflater.rb +28 -91
  24. data/src/ruby_lib/ruby_interface/logger.rb +3 -3
  25. data/src/ruby_lib/ruby_interface/request_handler.rb +23 -8
  26. data/src/ruby_lib/ruby_interface/utils.rb +17 -6
  27. data/src/ruby_lib/ruby_interface/version.rb +1 -1
  28. data/src/ruby_lib/webroar_app_loader.rb +2 -2
  29. data/src/worker/wkr_http.c +6 -6
  30. data/src/worker/wkr_http_response.c +8 -5
  31. data/src/worker/wkr_main.c +3 -3
  32. data/src/worker/wkr_static.c +5 -8
  33. data/src/worker/wkr_static.h +1 -1
  34. data/test/spec/content_encoding_spec.rb +14 -0
  35. metadata +2 -24
  36. data/src/admin_panel/public/blank_iframe.html +0 -2
  37. data/src/admin_panel/public/images/calendar_date_select/calendar.gif +0 -0
  38. data/src/admin_panel/public/javascripts/calendar_date_select/calendar_date_select.js +0 -443
  39. data/src/admin_panel/public/javascripts/calendar_date_select/format_american.js +0 -34
  40. data/src/admin_panel/public/javascripts/calendar_date_select/format_db.js +0 -27
  41. data/src/admin_panel/public/javascripts/calendar_date_select/format_euro_24hr.js +0 -7
  42. data/src/admin_panel/public/javascripts/calendar_date_select/format_euro_24hr_ymd.js +0 -7
  43. data/src/admin_panel/public/javascripts/calendar_date_select/format_finnish.js +0 -32
  44. data/src/admin_panel/public/javascripts/calendar_date_select/format_hyphen_ampm.js +0 -37
  45. data/src/admin_panel/public/javascripts/calendar_date_select/format_iso_date.js +0 -46
  46. data/src/admin_panel/public/javascripts/calendar_date_select/format_italian.js +0 -24
  47. data/src/admin_panel/public/javascripts/calendar_date_select/locale/de.js +0 -11
  48. data/src/admin_panel/public/javascripts/calendar_date_select/locale/fi.js +0 -10
  49. data/src/admin_panel/public/javascripts/calendar_date_select/locale/fr.js +0 -10
  50. data/src/admin_panel/public/javascripts/calendar_date_select/locale/pl.js +0 -10
  51. data/src/admin_panel/public/javascripts/calendar_date_select/locale/pt.js +0 -11
  52. data/src/admin_panel/public/javascripts/calendar_date_select/locale/ru.js +0 -10
  53. data/src/admin_panel/public/stylesheets/calendar_date_select/blue.css +0 -130
  54. data/src/admin_panel/public/stylesheets/calendar_date_select/default.css +0 -135
  55. data/src/admin_panel/public/stylesheets/calendar_date_select/plain.css +0 -128
  56. data/src/admin_panel/public/stylesheets/calendar_date_select/red.css +0 -135
  57. data/src/admin_panel/public/stylesheets/calendar_date_select/silver.css +0 -133
data/CHANGELOG CHANGED
@@ -1,3 +1,37 @@
1
+ v0.2.6 - 23-Dec-2009
2
+ --------------------
3
+
4
+ * Updated messages for HTTP status codes 400, 404, 405, 500 and 501.
5
+ * Fixed buffer overflow by allocating enough memory to hold REQUEST_PATH +
6
+ Application-Path in the request resolver for static assets.
7
+ * Improved the logic for detection of ruby shared library prerequisite.
8
+ * Started using RUBY_INSTALL_NAME for detecting ruby during installation.
9
+ * Added validation for search results file created while generating service
10
+ script. Installation would continue even if server cannot be installed as a
11
+ service.
12
+ * Corrected example for 'Headers' section in the config file.
13
+ * Removed 'SIGCHLD' handler from the worker process - Fixes the incorrect exit
14
+ status issue for a shell command executed using backquote method of ruby.
15
+ * Added HTTP Date header when the HTTP response status is 100.
16
+ * Used _POSIX_C_SOURCE macro to identify whether the file variable is a
17
+ pointer to a file or a socket fd.
18
+ * Corrected return type of 'send_static_worker_pid' method, if YAML parser
19
+ returns NULL value.
20
+ * Corrected time slider based analytics graphs issue when they were being seen
21
+ after 2300 hrs.
22
+ * Correctly implemented Rack specification for the Response Body. This fixes
23
+ worker crash seen after serving first request in Development Environment mode
24
+ for Rails 2.3.4+ applications.
25
+ * Overriding Rack::Deflater to skip response body compression for user-agent
26
+ Internet Explorer 6.0.
27
+ * Renamed 'log' message defined by rb_define_singleton_method() to
28
+ 'log_message'. This fixes the issue seen when Math.log is called by
29
+ number_to_human_size() in a Rails Application. It also fixes the worker crash
30
+ on REE installed with tcmalloc library. (Typically used to result in 404 error
31
+ for a user trying to access the Admin Panel.) Resolves Tickets #9 and #10.
32
+ * Code cleanup in Head, Worker and Helper modules.
33
+
34
+
1
35
  v0.2.5 - 07-Dec-2009
2
36
  --------------------
3
37
 
data/lib/dependencies.rb CHANGED
@@ -37,7 +37,7 @@ module Webroar
37
37
  def find
38
38
  name = @name
39
39
  case (name)
40
- when CONFIG['CC'], "make", CONFIG['RUBY_SO_NAME'], "starling"; flag = find_command(name)
40
+ when Config::CONFIG['CC'], "make", Config::CONFIG['RUBY_INSTALL_NAME'], "starling"; flag = find_command(name)
41
41
  when "libsqlite3.so", "sqlite3.h", "gnutls/gnutls.h"; flag = find_so(name)
42
42
  when "ruby_headers"; flag = find_ruby_headers()
43
43
  when "openssl.so"; flag = find_openssl(name)
@@ -51,11 +51,13 @@ module Webroar
51
51
  end
52
52
 
53
53
  def find_shared_lib()
54
- if Config::CONFIG['ENABLE_SHARED'] == 'yes'
55
- flag = "\e[32mfound\e[0m."
54
+ if File.exist?(File.join(Config::CONFIG['libdir'],Config::CONFIG['LIBRUBY_SO']))
55
+ flag = "\e[32mfound\e[0m at #{Config::CONFIG['libdir']}."
56
+ elsif Config::CONFIG['ENABLE_SHARED'] == 'yes'
57
+ flag = "\e[32mfound\e[0m."
56
58
  else
57
- flag="\e[31mnot found\e[0m."
58
- end
59
+ flag="\e[31mnot found\e[0m.\nUnable to find #{Config::CONFIG['LIBRUBY_SO']} at #{Config::CONFIG['libdir']}."
60
+ end
59
61
  return flag
60
62
  end
61
63
 
@@ -160,13 +162,13 @@ module Webroar
160
162
 
161
163
  end
162
164
  module Dependencies
163
- GCC = Dependency.new(CONFIG['CC'])
165
+ GCC = Dependency.new(Config::CONFIG['CC'])
164
166
  Gnutls = Dependency.new('gnutls/gnutls.h')
165
167
  Make = Dependency.new('make')
166
168
  LibRuby = Dependency.new(Config::CONFIG['LIBRUBY_SO'])
167
169
  LibSqlite = Dependency.new('libsqlite3.so')
168
170
  Ruby_OpenSSL = Dependency.new('openssl-ruby')
169
- Ruby = Dependency.new(CONFIG['RUBY_SO_NAME'])
171
+ Ruby = Dependency.new(Config::CONFIG['RUBY_INSTALL_NAME'])
170
172
  Ruby_DevHeaders = Dependency.new('ruby_headers')
171
173
  RubyGems = Dependency.new('rubygems')
172
174
  Sqlite_DevHeaders = Dependency.new('sqlite3.h')
data/lib/installer.rb CHANGED
@@ -91,19 +91,28 @@ class Installer
91
91
 
92
92
  def create_service_link(level, link_name, script_file)
93
93
  system("find /etc/ -name rc#{level}.d > /tmp/search_result 2>>#{WEBROAR_ROOT}/install.log")
94
+
95
+ return false if !File.size?("/tmp/search_result")
96
+
94
97
  file = File.open("/tmp/search_result")
95
98
  line = file.readline.chomp
96
99
  file.close()
100
+
101
+ return false if line == nil
102
+
97
103
  link_file = File.join(line,link_name)
98
104
 
99
- if line != nil and script_file != nil and !File.symlink?(link_file)
105
+ if script_file != nil and !File.symlink?(link_file)
100
106
  system("ln -s #{script_file} #{link_file} >>#{WEBROAR_ROOT}/install.log 2>>#{WEBROAR_ROOT}/install.log")
101
107
  end
108
+
109
+ return true
102
110
  end
103
111
 
104
112
  def create_service
105
113
  script = nil
106
114
  script_file = nil
115
+
107
116
  if(check_exe_file("chkconfig"))
108
117
  script = get_service_script("# chkconfig: 2345 85 15")
109
118
  else
@@ -111,24 +120,32 @@ class Installer
111
120
  end
112
121
 
113
122
  system("find /etc/ -name init.d > /tmp/search_result 2>>#{WEBROAR_ROOT}/install.log")
123
+
124
+ return false if !File.size?("/tmp/search_result")
125
+
114
126
  file = File.open("/tmp/search_result")
115
127
  line = file.readline.chomp
116
128
  file.close()
117
- if line != nil
118
- script_file = File.join("#{line}",'webroar')
119
- file = File.open(script_file,"w")
120
- file.puts(script)
121
- file.close
122
- system("chmod +x #{script_file} 2>>#{WEBROAR_ROOT}/install.log")
123
- end
124
129
 
125
- create_service_link("0", 'K15webroar', script_file)
126
- create_service_link("1", 'K15webroar', script_file)
127
- create_service_link("6", 'K15webroar', script_file)
128
- create_service_link("2", 'S85webroar', script_file)
129
- create_service_link("3", 'S85webroar', script_file)
130
- create_service_link("4", 'S85webroar', script_file)
131
- create_service_link("5", 'S85webroar', script_file)
130
+ return false if line == nil
131
+
132
+ script_file = File.join("#{line}",'webroar')
133
+
134
+ file = File.open(script_file,"w")
135
+ file.puts(script)
136
+ file.close
137
+
138
+ system("chmod +x #{script_file} 2>>#{WEBROAR_ROOT}/install.log")
139
+
140
+ return false if !create_service_link("0", 'K15webroar', script_file)
141
+ return false if !create_service_link("1", 'K15webroar', script_file)
142
+ return false if !create_service_link("6", 'K15webroar', script_file)
143
+ return false if !create_service_link("2", 'S85webroar', script_file)
144
+ return false if !create_service_link("3", 'S85webroar', script_file)
145
+ return false if !create_service_link("4", 'S85webroar', script_file)
146
+ return false if !create_service_link("5", 'S85webroar', script_file)
147
+
148
+ return true
132
149
 
133
150
  end
134
151
 
@@ -142,6 +159,7 @@ class Installer
142
159
  def install(options, args)
143
160
  ssl = false
144
161
  str = ""
162
+ err_msg = nil
145
163
 
146
164
  if options[:ssl]
147
165
  ssl = true
@@ -225,8 +243,17 @@ class Installer
225
243
  if RUBY_PLATFORM =~ /linux/ and !import
226
244
  print "Generating service script ..."
227
245
  # Add service script in '/etc/init.d/' folder
228
- create_service()
229
- puts " done."
246
+ if create_service()
247
+ puts " done."
248
+ else
249
+ puts " failed."
250
+ tmp_msg = "The server could not be installed as a service on this system. Unfortunately, you would have to set it up as a service yourself."
251
+ if err_msg
252
+ err_msg += tmp_msg
253
+ else
254
+ err_msg = tmp_msg
255
+ end
256
+ end
230
257
  end
231
258
 
232
259
  puts"WebROaR installed successfully."
@@ -239,6 +266,7 @@ class Installer
239
266
  system("webroar start")
240
267
 
241
268
  install_msg(port, false)
269
+ puts "Warning: " + err_msg if err_msg
242
270
  else
243
271
  puts " failed."
244
272
  puts "Error while migrating sqlite database. Please refer 'install.log' for details"
@@ -600,7 +628,7 @@ exit 0"
600
628
  # II) Expires value(mandatory) (No of seconds)
601
629
  # Possible value for expires is off or no. of seconds.
602
630
  # Example:
603
- # Header:
631
+ # Headers:
604
632
  # expires: 3600
605
633
  # expires_by_type:
606
634
  # - ext: png, jpg, gif
@@ -369,7 +369,7 @@ class GraphController < ApplicationController
369
369
  date_str = date_arr[0].split("/")
370
370
  start_hour = date_str[3]
371
371
  date_str1 = date_arr[1].split("/")
372
- end_hour = date_str1[3]
372
+ end_hour = (date_str1[3] == "0" ? "24" : date_str1[3])
373
373
  if start_hour.to_i != end_hour.to_i
374
374
  end_hour = end_hour.to_i-1
375
375
  start_time = Time.local(date_str[0], date_str[1], date_str[2], start_hour, "00", "00")
@@ -588,7 +588,7 @@ class GraphController < ApplicationController
588
588
  if session[:start_time] < Time.local(Time.now.year, Time.now.month, Time.now.day, "0","0","0")
589
589
  end_hour = 24
590
590
  else
591
- end_hour = (Time.now.advance(:hours => 1)).hour
591
+ end_hour = (Time.now.advance(:hours => 1)).hour
592
592
  end
593
593
  start_time = "#{session[:start_time].year}/#{session[:start_time].month}/#{session[:start_time].day}/#{start_hour}"
594
594
  end_time = "#{session[:start_time].year}/#{session[:start_time].month}/#{session[:start_time].day}/#{end_hour}"
@@ -21,6 +21,7 @@ along with WebROaR. If not, see <http://www.gnu.org/licenses/>.
21
21
 
22
22
  <script type = "text/javascript">
23
23
  $j(document).ready(function(){
24
+ <% end_hour = 24 if end_hour == 0 %>
24
25
  $j("#slider_new_<%=count%>").slider({
25
26
  range: true,
26
27
  animate:true,
@@ -125,7 +125,7 @@ class YAMLWriter
125
125
  # II) Expires value(mandatory) (No of seconds)
126
126
  # Possible value for expires is off or no. of seconds.
127
127
  # Example:
128
- # Header:
128
+ # Headers:
129
129
  # expires: 3600
130
130
  # expires_by_type:
131
131
  # - ext: png, jpg, gif
@@ -92,7 +92,6 @@ void wr_app_wrk_add_timeout_cb(struct ev_loop *loop, ev_timer *w, int revents) {
92
92
  void wr_app_wrk_remove_cb(struct ev_loop *loop, ev_timer *w, int revents) {
93
93
  LOG_FUNCTION
94
94
  wr_app_t* app = (wr_app_t*) w->data;
95
- wr_wkr_t* worker;
96
95
 
97
96
  ev_timer_stop(loop, &app->t_remove);
98
97
 
@@ -439,7 +438,7 @@ int wr_app_remove(wr_svr_t* server, const char* app_name) {
439
438
  }
440
439
 
441
440
  /** Check load balance to add the worker */
442
- int wr_app_chk_load_to_add_wkr(wr_app_t *app) {
441
+ void wr_app_chk_load_to_add_wkr(wr_app_t *app) {
443
442
  if(TOTAL_WORKER_COUNT(app) < app->conf->max_worker) {
444
443
  if(app->msg_que->q_count > app->high_ratio) {
445
444
  if(!ev_is_active(&app->t_add)) {
@@ -454,7 +453,7 @@ int wr_app_chk_load_to_add_wkr(wr_app_t *app) {
454
453
  }
455
454
 
456
455
  /** Check load balance to remove the worker */
457
- int wr_app_chk_load_to_remove_wkr(wr_app_t *app) {
456
+ void wr_app_chk_load_to_remove_wkr(wr_app_t *app) {
458
457
  //Check load
459
458
  if(WR_QUEUE_SIZE(app->wkr_que) > app->conf->min_worker) {
460
459
  if(app->msg_que->q_count < app->low_ratio) {
@@ -61,9 +61,9 @@ int wr_app_wkr_add(wr_app_t*);
61
61
  /** Add request message in pending queue */
62
62
  int wr_app_message_insert(wr_svr_t*, wr_req_t*);
63
63
  /** Check load balance to add the worker */
64
- int wr_app_chk_load_to_add_wkr(wr_app_t*);
64
+ void wr_app_chk_load_to_add_wkr(wr_app_t*);
65
65
  /** Check load balance to remove the worker */
66
- int wr_app_chk_load_to_remove_wkr(wr_app_t*);
66
+ void wr_app_chk_load_to_remove_wkr(wr_app_t*);
67
67
  /** Add newly created worker to application */
68
68
  int wr_app_wrk_insert(wr_svr_t *, wr_wkr_t*, const wr_ctl_msg_t*);
69
69
  /** Remove application from application list */
data/src/head/wr_config.h CHANGED
@@ -81,7 +81,7 @@
81
81
  // File to store Server process id
82
82
  #define WR_PID_FILE "/var/run/webroar.pid"
83
83
  #define WR_SERVER "WebROaR"
84
- #define WR_VERSION "0.2.5"
84
+ #define WR_VERSION "0.2.6"
85
85
  #define WR_MIME_TYPE_PATH "/conf/mime_type.yml"
86
86
  #define WR_CONF_PATH "/conf/config.yml"
87
87
  #define WR_SERVER_INTERNAL_CONF_PATH "/conf/server_internal_config.yml"
@@ -124,6 +124,7 @@
124
124
  #define WR_STR_LEN 64
125
125
  #define WR_LONG_STR_LEN 128
126
126
  #define WR_LONG_LONG_STR_LEN 512
127
+ #define WR_FILE_PATH_LEN 1024
127
128
 
128
129
  #define WR_DEFAULT_PREFIX_HASH 5381
129
130
  #define WR_MSG_SIZE 1024
@@ -83,9 +83,6 @@ static inline wr_app_conf_t* wr_app_conf_new(wr_svr_conf_t *server) {
83
83
  /** Create new configuration with default values */
84
84
  static inline wr_conf_t* wr_conf_new() {
85
85
  LOG_FUNCTION
86
- int i;
87
- wr_svr_conf_t *server;
88
- wr_app_conf_t *app;
89
86
  wr_conf_t *conf;
90
87
 
91
88
  conf = wr_malloc(wr_conf_t);
@@ -205,7 +202,6 @@ static inline int wr_conf_server_set(wr_conf_t * conf, node_t *root) {
205
202
  LOG_FUNCTION
206
203
  wr_svr_conf_t *server = conf->server;
207
204
  char *str;
208
- size_t len;
209
205
 
210
206
  // Set server listening port
211
207
  str = wr_validate_string(get_node_value(root, WR_CONF_SVR_PORT));
@@ -255,6 +251,7 @@ static inline int wr_conf_server_set(wr_conf_t * conf, node_t *root) {
255
251
  #ifdef HAVE_GNUTLS
256
252
 
257
253
  if(server->flag&WR_SVR_SSL_SUPPORT) {
254
+ size_t len;
258
255
  struct stat buff;
259
256
  // Set certificate path
260
257
  str = wr_validate_string(get_node_value(root, WR_CONF_SVR_SSL_CERTIFICATE));
@@ -311,7 +308,7 @@ static inline int wr_conf_server_set(wr_conf_t * conf, node_t *root) {
311
308
 
312
309
  static int wr_validate_app_host_name(const char *host_name, char *err_msg) {
313
310
  LOG_FUNCTION
314
- int down_level = 1, label_len, host_name_len, i;
311
+ int down_level = 1, label_len, i;
315
312
  char *label = NULL;
316
313
  char tmp_host[256];
317
314
  size_t len;
@@ -754,8 +751,7 @@ static inline int wr_chk_host_lists(wr_host_name_t *list1, wr_host_name_t *list2
754
751
  /** Removes Application object on repeated host_name. */
755
752
  static inline int wr_remove_app_with_dup_host(wr_conf_t *conf) {
756
753
  LOG_FUNCTION
757
- wr_app_conf_t *app=conf->apps, *tmp_app = NULL, *next_app;
758
- wr_host_name_t *host, *tmp_host, *next_host;
754
+ wr_app_conf_t *app=conf->apps, *tmp_app = NULL;
759
755
  short rv = 0;
760
756
 
761
757
  if(app == NULL) {
@@ -1040,10 +1036,7 @@ void wr_conf_free(wr_conf_t* conf) {
1040
1036
  wr_conf_t* wr_conf_read(const char* root_path) {
1041
1037
  LOG_FUNCTION
1042
1038
  node_t *root;
1043
- char *str;
1044
1039
  wr_conf_t* conf = NULL;
1045
- int can_start = 1;
1046
- struct stat buff;
1047
1040
 
1048
1041
  //Create configuration structure
1049
1042
  conf = wr_conf_new();
@@ -31,15 +31,15 @@ wr_http_status_t;
31
31
 
32
32
  static wr_http_status_t http_status [] ={
33
33
  {100, "100 Continue", ""},
34
- {400, "400 Bad Request", "The request could not be understood by the server."},
34
+ {400, "400 Bad Request", "The request could not be understood by the server due to malformed syntax."},
35
35
  {403, "403 Forbidden", "The requested page is forbidden."},
36
- {404, "404 Not Found", "The requested page could not be found."},
37
- {405, "405 Method Not Allowed", "The request method is not allowed."},
36
+ {404, "404 Not Found", "The server has not found anything matching the Request-URI."},
37
+ {405, "405 Method Not Allowed", "The method specified in the Request-Line is not allowed for the resource identified by the Request-URI."},
38
38
  {411, "411 Length Required", "The request requires 'Content-Length'."},
39
39
  {413, "413 Request Entity Too Large", "The request entity is too large"},
40
40
  {414, "414 Request-URI Too Large", "The request URI is too large"},
41
- {500, "500 Internal Server Error", "The server is facing some error while processing the request. "},
42
- {501, "501 Not Implemented", "The requested method is not implemented"}
41
+ {500, "500 Internal Server Error", "The server encountered an unexpected condition which prevented it from fulfilling the request."},
42
+ {501, "501 Not Implemented", "The server does not support the functionality required to fulfill the request."}
43
43
  };
44
44
 
45
45
  #define WR_RESP_BODY "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n\
@@ -257,13 +257,16 @@ void wr_conn_err_resp(wr_conn_t *conn, wr_resp_status_t resp_code) {
257
257
 
258
258
  LOG_DEBUG(DEBUG, "response code = %s",http_status[resp_code].phrase);
259
259
  conn->keep_alive = 0;
260
+
261
+ char current_date[WR_STR_LEN];
262
+ get_time(current_date, WR_STR_LEN);
260
263
 
261
264
  switch(resp_code) {
262
265
  case WR_HTTP_STATUS_100:
263
266
  body_len = 0;
264
267
  buff_len = sprintf(response_buff, WR_RESP_HEADERS,
265
- http_status[resp_code].phrase, WR_SERVER, WR_VERSION,
266
- body_len, http_status[resp_code].message);
268
+ http_status[resp_code].phrase, current_date, WR_SERVER,
269
+ WR_VERSION, body_len, http_status[resp_code].message);
267
270
  break;
268
271
  case WR_HTTP_STATUS_400:
269
272
  case WR_HTTP_STATUS_403:
@@ -285,9 +288,7 @@ void wr_conn_err_resp(wr_conn_t *conn, wr_resp_status_t resp_code) {
285
288
  http_status[resp_code].phrase,http_status[resp_code].phrase+4,
286
289
  http_status[resp_code].message,WR_SERVER, WR_VERSION);
287
290
  }
288
-
289
- char current_date[WR_STR_LEN];
290
- get_time(current_date, WR_STR_LEN);
291
+
291
292
  buff_len = sprintf(response_buff, WR_RESP_HEADERS,
292
293
  http_status[resp_code].phrase, current_date,
293
294
  WR_SERVER, WR_VERSION, body_len, response_body);
@@ -53,7 +53,7 @@
53
53
  static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl) {
54
54
  LOG_FUNCTION
55
55
  wr_ctl_msg_t* ctl_msg = wr_malloc(wr_ctl_msg_t);
56
- char *val, *val1, *val2;
56
+ char *val;
57
57
  char error[WR_STR_LEN];
58
58
 
59
59
  ctl->type = WR_CTL_MSG_NONE;
@@ -346,11 +346,8 @@ static void wr_ctl_accept_cb(struct ev_loop *loop, struct ev_io *w, int revents)
346
346
  /** Start listening for Workers connect request on Internet socket */
347
347
  static inline int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
348
348
  LOG_FUNCTION
349
- struct linger ling = {
350
- 0, 0
351
- };
352
349
  struct sockaddr_in addr;
353
- int flags = 1, len;
350
+ int len;
354
351
 
355
352
  if ((server->ctl->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
356
353
  perror("socket()");
@@ -422,7 +419,6 @@ static inline int wr_ctl_init_on_uds(wr_svr_t *server) {
422
419
 
423
420
  /* Preparing unique controller socket path*/
424
421
  pid_t pid=getpid();
425
- char pid_str[WR_SHORT_STR_LEN];
426
422
  sprintf(sock_path,"%s_%d",WR_CTL_SOCK_PATH,pid);
427
423
  size_t len = strlen(sock_path);
428
424
 
data/src/head/wr_main.c CHANGED
@@ -110,7 +110,7 @@ static inline void daemonize() {
110
110
  /* first instance continues */
111
111
  sprintf(str,"%d\n",getpid());
112
112
 
113
- int x = write(pid_FD,str,strlen(str)); /* record pid to lockfile */
113
+ write(pid_FD,str,strlen(str)); /* record pid to lockfile */
114
114
  close(pid_FD);
115
115
 
116
116
  signal(SIGCHLD, SIG_IGN);
@@ -206,7 +206,7 @@ int main(int argc, char *argv[]) {
206
206
  char *WR_ROOT = argv[1];
207
207
 
208
208
  //Initialize logger
209
- if(initialize_logger(WR_LOG_FILE) == 0) {
209
+ if(initialize_logger(WR_LOG_FILE, WR_SERVER, WR_VERSION) == 0) {
210
210
  LOG_DEBUG(DEBUG,"Logging started in %s file",WR_LOG_FILE);
211
211
  } else {
212
212
  printf("Logger initialization failed. Please make sure you have write permission on '/var/log/webroar' directory.");
@@ -66,7 +66,7 @@ static inline int wr_req_path_set(wr_req_t *req) {
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);
69
- return;
69
+ return -1;
70
70
  }
71
71
 
72
72
  // Set host and request path
@@ -91,7 +91,7 @@ static inline int wr_req_path_set(wr_req_t *req) {
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);
94
- return;
94
+ return -1;
95
95
  }
96
96
  } else {
97
97
  host_len = req->req_uri.len - (ptr - req->req_uri.str);
@@ -179,7 +179,6 @@ static int wr_req_header_length_check(wr_req_t *req, size_t length, int index){
179
179
  void wr_req_header_field_cb(ebb_request* request, const char *at, size_t length, int header_index) {
180
180
  wr_req_t* req = (wr_req_t*) request->data;
181
181
  short status = wr_req_header_length_check(req, length, header_index);
182
- size_t i;
183
182
 
184
183
  if(status != 0){
185
184
  wr_req_invalid(req->conn, status);
@@ -264,7 +263,6 @@ void wr_query_string_cb(ebb_request* request, const char *at, size_t length) {
264
263
  void wr_req_uri_cb(ebb_request* request, const char *at, size_t length) {
265
264
  LOG_FUNCTION
266
265
  wr_req_t* req =(wr_req_t*) request->data;
267
- char *value=NULL;
268
266
 
269
267
  if(req->req_uri.len + length > WR_MAX_REQ_URI_LEN) {
270
268
  LOG_DEBUG(DEBUG,"req uri len = %d",__FUNCTION__, req->req_uri.len);
@@ -457,7 +455,6 @@ void wr_headers_complete_cb(ebb_request * request) {
457
455
  void wr_req_complete_cb(ebb_request * request) {
458
456
  LOG_FUNCTION
459
457
  wr_req_t* req = (wr_req_t*) request->data;
460
- short retval;
461
458
  LOG_DEBUG(DEBUG,"req = %d",req->id);
462
459
  // Rewind file pointer if request body is written into file
463
460
  if(req->upload_file) {
@@ -43,7 +43,7 @@ void wr_req_resolver_print(wr_req_resolver_t* resolver) {
43
43
  /** Resolve static content */
44
44
  int wr_req_resolve_static_content(wr_req_t *req){
45
45
  LOG_FUNCTION
46
- char path[WR_LONG_STR_LEN];
46
+ char path[WR_FILE_PATH_LEN + WR_MAX_REQ_PATH_LEN];
47
47
  char *req_path;
48
48
  struct stat buf;
49
49
  int len;
@@ -297,7 +297,7 @@ int wr_req_resolve_http_req(wr_svr_t *server, wr_req_t *req) {
297
297
  }
298
298
 
299
299
  if(app && app->wkr_que->q_count > 0) {
300
- int rv = 0;
300
+ // int rv = 0;
301
301
  req->app = app;
302
302
  wr_req_resolve_static_content(req);
303
303
  LOG_DEBUG(DEBUG,"Application resolved with %s.", req->app->conf->name.str);
data/src/head/wr_server.c CHANGED
@@ -25,7 +25,6 @@ struct ev_idle idle_watcher; //Ideal watcher
25
25
  /** Create Server */
26
26
  wr_svr_t* wr_svr_new(struct ev_loop* loop, wr_conf_t* conf) {
27
27
  LOG_FUNCTION
28
- int i;
29
28
  wr_svr_t* server = wr_malloc(wr_svr_t);
30
29
 
31
30
  if(!server) {
@@ -163,7 +162,6 @@ int wr_svr_init(wr_svr_t** server, wr_conf_t *conf) {
163
162
  /** Destroy Server */
164
163
  void wr_svr_free(wr_svr_t* server) {
165
164
  LOG_FUNCTION
166
- int i;
167
165
  //Destroy ebb server object
168
166
  ebb_server_unlisten(&(server->ebb_svr));
169
167
 
data/src/head/wr_worker.c CHANGED
@@ -308,7 +308,6 @@ static void wr_req_body_write_cb(struct ev_loop *loop, struct ev_io *w, int reve
308
308
  //whenever there is a pending request for processing and worker's fd is ready for write, it will dump serialized data to worker by this function
309
309
  static void wr_req_hearer_write_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
310
310
  LOG_FUNCTION
311
- int error_flag=0;
312
311
  wr_req_t* req = (wr_req_t*) w->data;
313
312
  wr_wkr_t *worker = req->wkr;
314
313
  LOG_DEBUG(DEBUG,"Request %d",req->id);
@@ -500,7 +499,6 @@ void wr_wkr_free(wr_wkr_t *worker) {
500
499
  int wr_wkr_remove(wr_wkr_t *worker, int flag) {
501
500
  LOG_FUNCTION
502
501
  wr_app_t* app = worker->app;
503
- int i, index;
504
502
 
505
503
  if(worker->state & WR_WKR_ACTIVE)
506
504
  worker->state -= WR_WKR_ACTIVE;
@@ -537,7 +535,6 @@ int wr_wkr_create(wr_svr_t *server, wr_app_conf_t *app_conf) {
537
535
  char cuid_s[WR_SHORT_STR_LEN],
538
536
  cgid_s[WR_SHORT_STR_LEN],
539
537
  controller_path[WR_LONG_STR_LEN],
540
- analytics [WR_SHORT_STR_LEN],
541
538
  log_level[WR_SHORT_STR_LEN];
542
539
 
543
540
  wr_str_t baseuri;
@@ -648,7 +645,6 @@ void wr_wkr_dispatch_req(wr_req_t* req) {
648
645
  /** Handle connect request from Worker */
649
646
  int wr_wkr_connect(wr_ctl_t *ctl, const wr_ctl_msg_t *ctl_msg) {
650
647
  LOG_FUNCTION
651
- int retval;
652
648
  wr_svr_t* server = ctl->svr;
653
649
  wr_wkr_t* worker = NULL;
654
650
 
@@ -29,7 +29,6 @@
29
29
  #include<errno.h>
30
30
 
31
31
  static inline char* get_date_time();
32
- static inline char* get_executable_path();
33
32
  static inline char* get_log_file_path();
34
33
 
35
34
  //this macro should included in common utility
@@ -76,10 +75,7 @@ void redirect_standard_io() {
76
75
  }
77
76
 
78
77
  /** Initialize logger */
79
- int initialize_logger(const char*file_name) {
80
- char *path=NULL;
81
-
82
- int retval;
78
+ int initialize_logger(const char*file_name, const char *server, const char *version) {
83
79
  const char *PATH_SEPARATOR = "/";//in windows we'll need forward slash
84
80
  log_file_path=(char*)malloc(sizeof(char)*512);
85
81
  null_check(log_file_path);
@@ -105,7 +101,7 @@ int initialize_logger(const char*file_name) {
105
101
  }
106
102
  }
107
103
 
108
- fprintf(log_fp,"\nLog file opened at %s",get_date_time());
104
+ fprintf(log_fp,"\n%s-%s: Log file opened at %s",server, version, get_date_time());
109
105
  fclose(log_fp);
110
106
  return 0;
111
107
  }
@@ -145,7 +141,7 @@ char* get_log_level_string(LOG_SEVERITY level){
145
141
  case WARN: return "WARN";
146
142
  case SEVERE: return "SEVERE";
147
143
  case FATAL: return "FATAL";
148
- default: "Unknown";
144
+ default: return "Unknown";
149
145
  }
150
146
  }
151
147
 
@@ -166,6 +162,7 @@ LOG_SEVERITY get_log_severity(const char*str) {
166
162
  if(strcmp(str,"FATAL") == 0) {
167
163
  return FATAL;
168
164
  }
165
+ return DEBUG;
169
166
  }
170
167
 
171
168
  /** Change log file group-owner to given group and user id */
@@ -174,7 +171,7 @@ int change_log_file_owner(int user_id, int group_id) {
174
171
  }
175
172
 
176
173
  /** Set logging level */
177
- int set_log_severity(int severity) {
174
+ void set_log_severity(int severity) {
178
175
  LOG_INFO("setting log level to %s", get_log_level_string(severity));
179
176
  logging_level = severity;
180
177
  }
@@ -65,11 +65,11 @@ typedef enum
65
65
  #define LOG_FUNCTION LOG_DEBUG(DEBUG,"%s()", __FUNCTION__);
66
66
 
67
67
  void close_logger();
68
- int initialize_logger(const char*file_name); //prerequisite to use logger
68
+ int initialize_logger(const char*file_name, const char *server, const char *version); //prerequisite to use logger
69
69
  void a_log(const char* type,LOG_SEVERITY level,const char* format,...);
70
70
  void a_error(LOG_SEVERITY level, const char *file_name, int line_no, const char *function_name, const char *format, ...);
71
71
  int change_log_file_owner(int user_id, int group_id);
72
72
  LOG_SEVERITY get_log_severity(const char*str);
73
- int set_log_severity(int);
73
+ void set_log_severity(int);
74
74
  void redirect_standard_io();
75
75
  #endif //end of wr_logger.h
@@ -147,7 +147,7 @@ node_t* yaml_parse(const char*file_name) {
147
147
  yaml_event_t event;
148
148
  node_t *node, *config = NULL, *prev;
149
149
  int done = 0, is_key = 0, seq_count = -1, is_seq = 0;
150
- char key[100], value[100], seq[10][100];
150
+ char seq[10][100];
151
151
  node_t* stack[100];
152
152
  int head = -1;
153
153
 
@@ -62,8 +62,15 @@ module Webroar
62
62
  false
63
63
  end
64
64
 
65
- def write_body(body)
66
- if body.kind_of?(String)
65
+ def write_body(body)
66
+ if body.respond_to?(:to_path) and File.exists?(body.to_path)
67
+ #TODO: Implement 'sendfile' call for kernel-to-kernel transfer.
68
+ file = File.open(body.to_path, 'rb')
69
+ while content = file.read(Webroar::READ_CHUNK_SIZE)
70
+ Webroar::client_write_body(self, content)
71
+ end
72
+ file.close
73
+ elsif body.kind_of?(String)
67
74
  Webroar::client_write_body(self, body)
68
75
  else
69
76
  body.each {|p|