gloo 3.4.1 → 3.6.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 (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