gloo 3.4.1 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/lib/VERSION +1 -1
  4. data/lib/VERSION_NOTES +15 -0
  5. data/lib/gloo/app/args.rb +2 -2
  6. data/lib/gloo/app/engine.rb +21 -2
  7. data/lib/gloo/app/info.rb +0 -2
  8. data/lib/gloo/convert/converter.rb +1 -2
  9. data/lib/gloo/convert/string_to_integer.rb +2 -0
  10. data/lib/gloo/core/dictionary.rb +1 -1
  11. data/lib/gloo/core/event_manager.rb +19 -0
  12. data/lib/gloo/core/factory.rb +2 -2
  13. data/lib/gloo/core/gloo_system.rb +1 -1
  14. data/lib/gloo/core/here.rb +1 -1
  15. data/lib/gloo/core/obj.rb +61 -5
  16. data/lib/gloo/core/parser.rb +1 -1
  17. data/lib/gloo/core/pn.rb +1 -1
  18. data/lib/gloo/exec/dispatch.rb +19 -0
  19. data/lib/gloo/exec/runner.rb +1 -1
  20. data/lib/gloo/objs/basic/integer.rb +10 -1
  21. data/lib/gloo/objs/ctrl/each.rb +17 -184
  22. data/lib/gloo/objs/ctrl/each_child.rb +68 -0
  23. data/lib/gloo/objs/ctrl/each_file.rb +83 -0
  24. data/lib/gloo/objs/ctrl/each_line.rb +67 -0
  25. data/lib/gloo/objs/ctrl/each_repo.rb +84 -0
  26. data/lib/gloo/objs/ctrl/each_word.rb +67 -0
  27. data/lib/gloo/objs/data/mysql.rb +2 -2
  28. data/lib/gloo/objs/data/pg.rb +1 -1
  29. data/lib/gloo/objs/data/query.rb +54 -5
  30. data/lib/gloo/objs/data/query_result.rb +6 -1
  31. data/lib/gloo/objs/data/sqlite.rb +1 -1
  32. data/lib/gloo/objs/data/table.rb +2 -2
  33. data/lib/gloo/objs/ror/eval.rb +1 -1
  34. data/lib/gloo/objs/security/password.rb +5 -8
  35. data/lib/gloo/objs/system/file_handle.rb +39 -5
  36. data/lib/gloo/objs/web_svr/element.rb +2 -2
  37. data/lib/gloo/objs/web_svr/page.rb +16 -6
  38. data/lib/gloo/objs/web_svr/svr.rb +29 -13
  39. data/lib/gloo/persist/file_loader.rb +2 -2
  40. data/lib/gloo/persist/file_storage.rb +1 -1
  41. data/lib/gloo/persist/line_splitter.rb +1 -0
  42. data/lib/gloo/verbs/check.rb +54 -0
  43. data/lib/gloo/verbs/redirect.rb +34 -2
  44. data/lib/gloo/verbs/tell.rb +11 -36
  45. data/lib/gloo/web_svr/handler.rb +32 -5
  46. data/lib/gloo/web_svr/request.rb +11 -40
  47. data/lib/gloo/web_svr/request_params.rb +104 -0
  48. data/lib/gloo/web_svr/response.rb +25 -0
  49. data/lib/gloo/web_svr/response_code.rb +1 -1
  50. data/lib/gloo/web_svr/routing/router.rb +10 -2
  51. data/lib/gloo/web_svr/session.rb +18 -12
  52. metadata +10 -3
@@ -114,14 +114,22 @@ module Gloo
114
114
  params_can = find_child PARAMS
115
115
  return nil unless params_can
116
116
 
117
+ # First set URL route params if there are any.
118
+ if @request&.request_params&.route_params
119
+ @request.request_params.route_params.each_with_index do |route_p,i|
120
+ o = params_can.children[i]
121
+ o.set_value( route_p ) if o && o.name != ID
122
+ end
123
+ end
124
+
117
125
  if @request
118
- url_params = @request.query_params
126
+ url_params = @request.request_params.query_params
119
127
  url_params.each do |k,v|
120
128
  o = params_can.find_child k
121
129
  o.set_value( v ) if o
122
130
  end
123
131
 
124
- @request.body_params.each do |k,v|
132
+ @request.request_params.body_params.each do |k,v|
125
133
  o = params_can.find_child k
126
134
  o.set_value( v ) if o
127
135
  end
@@ -316,8 +324,8 @@ module Gloo
316
324
  # Set the ID parameter if there is one.
317
325
  #
318
326
  def set_id
319
- return unless @request.id
320
- @engine.log.info "Setting ID: #{@request.id}"
327
+ return unless @request.request_params.id
328
+ @engine.log.info "Setting ID: #{@request.request_params.id}"
321
329
 
322
330
  params_can = find_child PARAMS
323
331
  return nil unless params_can
@@ -325,7 +333,7 @@ module Gloo
325
333
  id_obj = params_can.find_child( ID )
326
334
  return unless id_obj
327
335
 
328
- id_obj.set_value( @request.id )
336
+ id_obj.set_value( @request.request_params.id )
329
337
  end
330
338
 
331
339
  #
@@ -336,6 +344,8 @@ module Gloo
336
344
  #
337
345
  def render request=nil
338
346
  @request = request
347
+
348
+ # TODO : refactor this
339
349
  set_id if @request
340
350
 
341
351
  # Run the on prerender script
@@ -354,7 +364,7 @@ module Gloo
354
364
  elsif is_text?
355
365
  contents = render_text params
356
366
  else
357
- @engine.log.error "Unknown content type: #{content_type}"
367
+ @engine.err "Unknown content type: #{content_type}"
358
368
  return nil
359
369
  end
360
370
 
@@ -50,6 +50,7 @@ module Gloo
50
50
  CODE = 'code'.freeze
51
51
  ELAPSED = 'elapsed'.freeze
52
52
  DB = 'db'.freeze
53
+ PAGE = 'page'.freeze
53
54
 
54
55
  # Container with pages in the web app.
55
56
  PAGES = 'pages'.freeze
@@ -73,7 +74,8 @@ module Gloo
73
74
  # If the redirect is set, then use that page instead
74
75
  # of the one requested.
75
76
  #
76
- attr_accessor :redirect, :router, :asset, :embedded_renderer
77
+ attr_accessor :redirect, :redirect_hard
78
+ attr_accessor :router, :asset, :embedded_renderer
77
79
  attr_accessor :session
78
80
 
79
81
  #
@@ -291,7 +293,7 @@ module Gloo
291
293
  child_obj = session_container.find_child( key )
292
294
  unless child_obj
293
295
  fac = @engine.factory
294
- child_obj = fac.create_string key, value, session_obj
296
+ child_obj = fac.create_string key, value, session_container
295
297
  end
296
298
  child_obj.value = value
297
299
  end
@@ -426,7 +428,7 @@ module Gloo
426
428
  @engine.stop_running_app
427
429
  # The running app will call the stop function (below)
428
430
  else
429
- @engine.log.error SERVER_NOT_RUNNING
431
+ @engine.err SERVER_NOT_RUNNING
430
432
  end
431
433
  end
432
434
 
@@ -437,7 +439,7 @@ module Gloo
437
439
  if @router
438
440
  @router.show_routes
439
441
  else
440
- @engine.log.error SERVER_NOT_RUNNING
442
+ @engine.err SERVER_NOT_RUNNING
441
443
  end
442
444
  end
443
445
 
@@ -558,15 +560,29 @@ module Gloo
558
560
  # This is done after the page is rendered and before
559
561
  # the on_response event is fired.
560
562
  #
561
- def set_response_data( request, response )
562
- data = find_child RESPONSE_DATA
563
- return unless data
564
- data = Gloo::Objs::Alias.resolve_alias( @engine, data )
565
-
566
- data.find_child( ELAPSED )&.set_value( request.elapsed )
567
- data.find_child( DB )&.set_value( request.db )
568
- data.find_child( TYPE )&.set_value( response.type )
569
- data.find_child( CODE )&.set_value( response.code )
563
+ def set_response_data( request, response, page_obj=nil )
564
+ begin
565
+ data = find_child RESPONSE_DATA
566
+ return unless data
567
+ data = Gloo::Objs::Alias.resolve_alias( @engine, data )
568
+
569
+ data.find_child( ELAPSED )&.set_value( request.elapsed )
570
+ data.find_child( DB )&.set_value( request.db )
571
+
572
+ if ( response )
573
+ data.find_child( TYPE )&.set_value( response.type )
574
+ data.find_child( CODE )&.set_value( response.code )
575
+ else
576
+ data.find_child( TYPE )&.set_value( '' )
577
+ data.find_child( CODE )&.set_value( '' )
578
+ end
579
+
580
+ if page_obj
581
+ data.find_child( PAGE )&.set_value( page_obj.pn )
582
+ end
583
+ rescue => e
584
+ @engine.log_exception e
585
+ end
570
586
  end
571
587
 
572
588
 
@@ -35,7 +35,7 @@ module Gloo
35
35
  #
36
36
  def load
37
37
  unless @mech.exist?( @pn )
38
- @engine.log.error "File '#{@pn}' does not exist."
38
+ @engine.err "File '#{@pn}' does not exist."
39
39
  return
40
40
  end
41
41
 
@@ -154,7 +154,7 @@ module Gloo
154
154
  params = { name: name, type: type, value: value, parent: @parent }
155
155
  @last = @engine.factory.create( params )
156
156
 
157
- if value.empty? && @last&.multiline_value?
157
+ if value&.empty? && @last&.multiline_value?
158
158
  @multi_indent = 0
159
159
  @in_multiline = true
160
160
  puts "*** Start multiline. multi_indent: #{@multi_indent}" if @debug
@@ -37,7 +37,7 @@ module Gloo
37
37
  if @obj
38
38
  @engine.log.debug "Loaded object: #{@obj.name}"
39
39
  else
40
- @engine.log.error "Error loading file at #{@pn}"
40
+ @engine.err "Error loading file at #{@pn}"
41
41
  end
42
42
  end
43
43
 
@@ -39,6 +39,7 @@ module Gloo
39
39
  def detect_name
40
40
  @line = @line.strip
41
41
  @idx = @line.index( ' ' )
42
+ @idx = 0 unless @idx
42
43
  @name = @line[ 0..@idx - 1 ]
43
44
  end
44
45
 
@@ -0,0 +1,54 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2024 Eric Crane. All rights reserved.
3
+ #
4
+ # Alternate version of the Tell verb.
5
+ # Reads better to check object conditions.
6
+ #
7
+
8
+ module Gloo
9
+ module Verbs
10
+ class Check < Gloo::Core::Verb
11
+
12
+ KEYWORD = 'check'.freeze
13
+ KEYWORD_SHORT = '<-'.freeze
14
+ FOR = 'for'.freeze
15
+ UNKNOWN_MSG_ERR = 'Missing message!'.freeze
16
+
17
+ #
18
+ # Run the verb.
19
+ #
20
+ def run
21
+ msg = @tokens.after_token( FOR )
22
+
23
+ unless msg
24
+ @engine.err( UNKNOWN_MSG_ERR )
25
+ return
26
+ end
27
+
28
+ Gloo::Exec::Dispatch.send_message(
29
+ @engine, msg, @tokens.second, @params )
30
+ end
31
+
32
+ #
33
+ # Get the Verb's keyword.
34
+ #
35
+ def self.keyword
36
+ return KEYWORD
37
+ end
38
+
39
+ #
40
+ # Get the Verb's keyword shortcut.
41
+ #
42
+ def self.keyword_shortcut
43
+ return KEYWORD_SHORT
44
+ end
45
+
46
+ # ---------------------------------------------------------------------
47
+ # Private functions
48
+ # ---------------------------------------------------------------------
49
+
50
+ private
51
+
52
+ end
53
+ end
54
+ end
@@ -13,6 +13,7 @@ module Gloo
13
13
  KEYWORD_SHORT = 'go'.freeze
14
14
 
15
15
  RUN_MESSAGE = 'run'.freeze
16
+ KEYWORD_HARD = 'hard'.freeze
16
17
 
17
18
  MISSING_EXPR_ERR = 'Missing Expression!'.freeze
18
19
  APP_NOT_RUNING_ERR = 'The application is not running!'.freeze
@@ -27,8 +28,12 @@ module Gloo
27
28
  return
28
29
  end
29
30
 
30
- determine_target
31
- redirect_to_target
31
+ if is_hard_redirect?
32
+ redirect_hard
33
+ else
34
+ determine_target
35
+ redirect_to_target
36
+ end
32
37
  end
33
38
 
34
39
  #
@@ -51,6 +56,32 @@ module Gloo
51
56
 
52
57
  private
53
58
 
59
+ #
60
+ # Is this a hard redirect?
61
+ # A hard redirect returns the new URL to the client.
62
+ #
63
+ def is_hard_redirect?
64
+ return false unless @params&.token_count&.positive?
65
+
66
+ param_val = @params.tokens.first
67
+ return ( param_val.downcase == KEYWORD_HARD )
68
+ end
69
+
70
+ #
71
+ # Redirect to the target using a hard redirect.
72
+ #
73
+ def redirect_hard
74
+ expr = Gloo::Expr::Expression.new( @engine, @tokens.params )
75
+ to_site = expr.evaluate
76
+
77
+ if @engine.app_running?
78
+ @engine.exec_env.running_script.break_out
79
+ @engine.running_app.obj.redirect_hard = to_site
80
+ else
81
+ @engine.err APP_NOT_RUNING_ERR
82
+ end
83
+ end
84
+
54
85
  #
55
86
  # Send the control to the redirect target.
56
87
  # This could be a page or a script.
@@ -83,6 +114,7 @@ module Gloo
83
114
  #
84
115
  def redirect_to_page
85
116
  if @engine.app_running?
117
+ @engine.exec_env.running_script.break_out
86
118
  @engine.running_app.obj.redirect = @target_obj
87
119
  else
88
120
  @engine.err APP_NOT_RUNING_ERR
@@ -1,7 +1,9 @@
1
1
  # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
2
  # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
3
  #
4
- # Create an object, optionally of a type.
4
+ # Send a message to an object.
5
+ # Tell the object to do some known action.
6
+ # Also see the Check verb.
5
7
  #
6
8
 
7
9
  module Gloo
@@ -11,18 +13,21 @@ module Gloo
11
13
  KEYWORD = 'tell'.freeze
12
14
  KEYWORD_SHORT = '->'.freeze
13
15
  TO = 'to'.freeze
14
- OBJ_NOT_FOUND_ERR = 'Object was not found: '.freeze
15
16
  UNKNOWN_MSG_ERR = 'Missing message!'.freeze
16
17
 
17
18
  #
18
19
  # Run the verb.
19
20
  #
20
21
  def run
21
- setup_msg
22
- return unless @msg
22
+ msg = @tokens.after_token( TO )
23
23
 
24
- setup_target
25
- dispatch_msg
24
+ unless msg
25
+ @engine.err( UNKNOWN_MSG_ERR )
26
+ return
27
+ end
28
+
29
+ Gloo::Exec::Dispatch.send_message(
30
+ @engine, msg, @tokens.second, @params )
26
31
  end
27
32
 
28
33
  #
@@ -45,36 +50,6 @@ module Gloo
45
50
 
46
51
  private
47
52
 
48
- #
49
- # Lookup the message to send.
50
- #
51
- def setup_msg
52
- @msg = @tokens.after_token( TO )
53
-
54
- @engine.err( UNKNOWN_MSG_ERR ) unless @msg
55
- end
56
-
57
- #
58
- # Setup the target of the message.
59
- #
60
- def setup_target
61
- @obj_name = @tokens.second
62
- pn = Gloo::Core::Pn.new( @engine, @obj_name )
63
- @target_obj = pn.resolve
64
- end
65
-
66
- #
67
- # Dispatch the message to the target object.
68
- #
69
- def dispatch_msg
70
- if @target_obj
71
- Gloo::Exec::Dispatch.message(
72
- @engine, @msg, @target_obj, @params )
73
- else
74
- @engine.err "#{OBJ_NOT_FOUND_ERR} #{@obj_name}"
75
- end
76
- end
77
-
78
53
  end
79
54
  end
80
55
  end
@@ -35,21 +35,28 @@ module Gloo
35
35
  #
36
36
  def handle request
37
37
  @request = request
38
+ page_obj = nil
39
+ route_params = nil
38
40
 
39
- page, id = @server_obj.router.page_for_route( @request.path, @request.method )
41
+ page, id, route_params = @server_obj.router.page_for_route( @request.path, @request.method )
40
42
  @engine.log.debug "Found Page: #{page&.name}" if page
41
- request.id = id
43
+
44
+ request.request_params.id = id
45
+ request.request_params.route_params = route_params
46
+ request.request_params.log_id_keys
47
+
42
48
  if page
43
49
  if page.is_a? Gloo::Objs::FileHandle
44
50
  result = handle_file page
45
51
  else
46
52
  result = handle_page page
53
+ page_obj = page
47
54
  end
48
55
  else
49
56
  result = server_error_result
50
57
  end
51
58
 
52
- return result
59
+ return result, page_obj
53
60
  end
54
61
 
55
62
  #
@@ -58,7 +65,10 @@ module Gloo
58
65
  #
59
66
  def handle_page page
60
67
  result = page.render @request
61
- if redirect_set?
68
+ if redirect_hard_set?
69
+ result = server_redirect_result
70
+ @engine.running_app.obj.redirect_hard = nil
71
+ elsif redirect_set?
62
72
  page = @engine.running_app.obj.redirect
63
73
  @log.debug "Redirecting to: #{page.pn}"
64
74
  @engine.running_app.obj.redirect = nil
@@ -108,7 +118,7 @@ module Gloo
108
118
 
109
119
 
110
120
  # ---------------------------------------------------------------------
111
- # Helper functions
121
+ # Redirect Helper functions
112
122
  # ---------------------------------------------------------------------
113
123
 
114
124
  #
@@ -119,6 +129,23 @@ module Gloo
119
129
  return @engine.running_app.obj.redirect
120
130
  end
121
131
 
132
+ #
133
+ # Is there a redirect page set in the running app?
134
+ #
135
+ def redirect_hard_set?
136
+ return false unless @engine.app_running?
137
+ return @engine.running_app.obj.redirect_hard
138
+ end
139
+
140
+ #
141
+ # Return a redirect result.
142
+ #
143
+ def server_redirect_result
144
+ target = @engine.running_app.obj.redirect_hard
145
+
146
+ return Gloo::WebSvr::Response.redirect_response( @engine, target )
147
+ end
148
+
122
149
  end
123
150
  end
124
151
  end
@@ -23,9 +23,9 @@ module Gloo
23
23
  HTTP_HOST = 'HTTP_HOST'.freeze
24
24
  QUERY_STRING = 'QUERY_STRING'.freeze
25
25
 
26
- attr_reader :method, :host, :path, :query, :body, :ip
26
+ attr_reader :method, :host, :path, :ip, :query
27
27
  attr_reader :db, :elapsed
28
- attr_accessor :id
28
+ attr_accessor :request_params
29
29
 
30
30
 
31
31
  # ---------------------------------------------------------------------
@@ -38,6 +38,7 @@ module Gloo
38
38
  def initialize( engine, handler, env = nil )
39
39
  @engine = engine
40
40
  @log = @engine.log
41
+ @request_params = RequestParams.new( @log )
41
42
 
42
43
  @handler = handler
43
44
 
@@ -60,11 +61,11 @@ module Gloo
60
61
  @handler.server_obj.set_request_data self
61
62
  @handler.server_obj.run_on_request
62
63
 
63
- result = @handler.handle self
64
+ result, page_obj = @handler.handle self
64
65
  finish_timer
65
66
 
66
67
  # Run the on_response script if there is one.
67
- @handler.server_obj.set_response_data self, result
68
+ @handler.server_obj.set_response_data( self, result, page_obj )
68
69
  @handler.server_obj.run_on_response
69
70
 
70
71
  return result
@@ -85,18 +86,13 @@ module Gloo
85
86
  @path = req.path
86
87
  @host = req.host_with_port
87
88
  @query = req.query_string
88
- @ip = req.ip
89
-
90
- # @method = @env[ REQUEST_METHOD ]
91
- # @path = @env[ REQUEST_PATH ]
92
- # @host = @env[ HTTP_HOST ]
93
- # @query = @env[ QUERY_STRING ]
94
89
 
90
+ @request_params.init_query_params( @query )
91
+ @ip = req.ip
95
92
  @handler.server_obj.session.set_session_data_for_request( @env )
96
93
 
97
- @body = @env[ 'rack.input' ].read
98
- @body = Rack::Utils.parse_query @body
99
- check_body_method
94
+ @request_params.init_body_params( @env[ 'rack.input' ].read )
95
+ @method = @request_params.get_body_method_override @method
100
96
  end
101
97
 
102
98
 
@@ -127,38 +123,13 @@ module Gloo
127
123
  # Helper functions
128
124
  # ---------------------------------------------------------------------
129
125
 
130
- #
131
- # Check the body to see if there is a PATCH or a PUT in
132
- # the method override.
133
- #
134
- def check_body_method
135
- if @body[ '_method' ]
136
- @method = @body[ '_method' ].upcase
137
- end
138
- end
139
-
140
- #
141
- # Get the hash of query parameters.
142
- #
143
- def query_params
144
- return {} unless @query
145
- return Rack::Utils.parse_query( @query )
146
- end
147
-
148
- #
149
- # Get the hash of body parameters.
150
- #
151
- def body_params
152
- return @body ? @body : {}
153
- end
154
-
155
126
  #
156
127
  # Write the request information to the log.
157
128
  #
158
129
  def log
159
130
  @log.info "#{@method} #{@host}#{@path}"
160
- @log.info "Parameters: #{@query}"
161
- @log.info "Body: #{@body}" unless @body.empty?
131
+
132
+ @request_params.log_params
162
133
  end
163
134
 
164
135
  end
@@ -0,0 +1,104 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2024 Eric Crane. All rights reserved.
3
+ #
4
+ # A Parameters associated with a request.
5
+ #
6
+ # Kinds of Params
7
+ # Id - The entity id
8
+ # Key - URL parameter key
9
+ # URL Params - Parameters in the URL
10
+ # Body Params - Data from the body of the request
11
+ #
12
+
13
+ module Gloo
14
+ module WebSvr
15
+ class RequestParams
16
+
17
+ attr_accessor :id, :route_params
18
+ attr_reader :query_params, :body_params
19
+
20
+ # ---------------------------------------------------------------------
21
+ # Initialization
22
+ # ---------------------------------------------------------------------
23
+
24
+ #
25
+ # Set up the web server.
26
+ #
27
+ def initialize( log )
28
+ @log = log
29
+ end
30
+
31
+
32
+ # ---------------------------------------------------------------------
33
+ # Value Detection
34
+ # ---------------------------------------------------------------------
35
+
36
+ #
37
+ # Detect the parameters from query string.
38
+ #
39
+ def init_query_params query_string
40
+ if query_string
41
+ @query_params = Rack::Utils.parse_query( query_string )
42
+ else
43
+ @query_params = {}
44
+ end
45
+ end
46
+
47
+ #
48
+ # Detect the parameters from the body of the request.
49
+ #
50
+ def init_body_params body
51
+ if body
52
+ @body_params = Rack::Utils.parse_query body
53
+ else
54
+ @body_params = {}
55
+ end
56
+ end
57
+
58
+
59
+ # ---------------------------------------------------------------------
60
+ # Helper functions
61
+ # ---------------------------------------------------------------------
62
+
63
+ #
64
+ # Check the body to see if there is a PATCH or a PUT in
65
+ # the method override.
66
+ #
67
+ def get_body_method_override orig_method
68
+ if @body_params[ '_method' ]
69
+ return @body_params[ '_method' ].upcase
70
+ end
71
+ return orig_method
72
+ end
73
+
74
+ #
75
+ # Write the querey and body params to the log.
76
+ #
77
+ def log_params
78
+ return unless @log
79
+
80
+ if @query_params && ! @query_params.empty?
81
+ @log.info "--- Query Parameters: #{@query_params}"
82
+ end
83
+
84
+ if @body_params && ! @body_params.empty?
85
+ @log.info "--- Body Parameters: #{@body_params}"
86
+ end
87
+ end
88
+
89
+ #
90
+ # Write the id and route params to the log.
91
+ #
92
+ def log_id_keys
93
+ return unless @log
94
+
95
+ @log.info "--- ID Parameter: #{@id}" if @id
96
+
97
+ if @route_params && ! @route_params.empty?
98
+ @log.info "--- Route Parameters: #{@route_params}"
99
+ end
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -18,6 +18,7 @@ module Gloo
18
18
  HTML_TYPE = 'text/html'.freeze
19
19
 
20
20
  attr_reader :code, :type, :data
21
+ attr_accessor :location
21
22
 
22
23
 
23
24
  # ---------------------------------------------------------------------
@@ -37,6 +38,7 @@ module Gloo
37
38
  @code = code
38
39
  @type = type
39
40
  @data = data
41
+ @location = nil
40
42
  end
41
43
 
42
44
 
@@ -71,6 +73,25 @@ module Gloo
71
73
  return Gloo::WebSvr::Response.new( engine, code, HTML_TYPE, data )
72
74
  end
73
75
 
76
+ #
77
+ # Helper to create a redirect response.
78
+ #
79
+ def self.redirect_response( engine, target )
80
+ code = Gloo::WebSvr::ResponseCode::FOUND
81
+ data = <<~TEXT
82
+ <head>
83
+ <html>
84
+ <body><a href="#{target}">target is here</a></body>
85
+ </html>
86
+ </head>
87
+ TEXT
88
+
89
+ response = Gloo::WebSvr::Response.new( engine, code, HTML_TYPE, data )
90
+ response.location = target
91
+
92
+ return response
93
+ end
94
+
74
95
 
75
96
  # ---------------------------------------------------------------------
76
97
  # Data Functions
@@ -97,6 +118,10 @@ module Gloo
97
118
 
98
119
  headers = { CONTENT_TYPE => @type }
99
120
 
121
+ if @location
122
+ headers[ 'Location' ] = @location
123
+ end
124
+
100
125
  session = @engine&.running_app&.obj&.session
101
126
  headers = session.add_session_for_response( headers ) if session
102
127