|
1 | 1 | #!/usr/bin/env ruby |
2 | 2 |
|
3 | | -# Simple Hello World Web Server |
4 | | -# This is a basic example to get you started with Ruby web development |
5 | | - |
6 | | -require 'socket' |
7 | 3 | require 'featurevisor' |
8 | 4 | require 'net/http' |
9 | 5 | require 'json' |
10 | 6 |
|
11 | | -class HelloWorldServer |
12 | | - def initialize(port = 3000) |
13 | | - @port = port |
14 | | - @server = nil |
15 | | - |
16 | | - ## |
17 | | - # Initialize Featurevisor |
18 | | - # |
19 | | - datafile_url = "https://featurevisor-example-cloudflare.pages.dev/production/featurevisor-tag-all.json" |
20 | | - |
21 | | - # Fetch the datafile |
22 | | - response = Net::HTTP.get(URI(datafile_url)) |
23 | | - datafile_content = JSON.parse(response) |
24 | | - symbolized_datafile = symbolize_keys(datafile_content) # @TODO: this shouldn't be required |
25 | | - |
26 | | - # Create Featurevisor instance |
27 | | - @featurevisor = Featurevisor.create_instance( |
28 | | - datafile: symbolized_datafile, |
29 | | - ) |
| 7 | +def symbolize_keys(obj) |
| 8 | + case obj |
| 9 | + when Hash |
| 10 | + obj.transform_keys(&:to_sym).transform_values { |v| symbolize_keys(v) } |
| 11 | + when Array |
| 12 | + obj.map { |v| symbolize_keys(v) } |
| 13 | + else |
| 14 | + obj |
30 | 15 | end |
| 16 | +end |
31 | 17 |
|
32 | | - def symbolize_keys(obj) |
33 | | - case obj |
34 | | - when Hash |
35 | | - obj.transform_keys(&:to_sym).transform_values { |v| symbolize_keys(v) } |
36 | | - when Array |
37 | | - obj.map { |v| symbolize_keys(v) } |
38 | | - else |
39 | | - obj |
40 | | - end |
41 | | - end |
42 | | - |
43 | | - def start |
44 | | - puts "Starting Hello World Web Server on port #{@port}..." |
45 | | - puts "Visit http://localhost:#{@port} in your browser" |
46 | | - puts "Press Ctrl+C to stop the server" |
47 | | - puts |
48 | | - |
49 | | - @server = TCPServer.new(@port) |
50 | | - |
51 | | - loop do |
52 | | - begin |
53 | | - client = @server.accept |
54 | | - handle_request(client) |
55 | | - rescue Interrupt |
56 | | - puts "\nShutting down server..." |
57 | | - break |
58 | | - rescue => e |
59 | | - puts "Error handling request: #{e.message}" |
60 | | - ensure |
61 | | - client&.close |
62 | | - end |
63 | | - end |
64 | | - end |
65 | | - |
66 | | - def handle_request(client) |
67 | | - request_line = client.gets |
68 | | - return unless request_line |
69 | | - |
70 | | - method, path, version = request_line.split(' ') |
71 | | - |
72 | | - # Log the request |
73 | | - puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} - #{method} #{path}" |
74 | | - |
75 | | - # Read headers |
76 | | - headers = {} |
77 | | - while (line = client.gets) && line.strip != '' |
78 | | - key, value = line.split(': ', 2) |
79 | | - headers[key.downcase] = value&.strip |
80 | | - end |
81 | | - |
82 | | - # Generate response |
83 | | - response = generate_response(method, path) |
84 | | - |
85 | | - # Send response |
86 | | - client.write(response) |
87 | | - end |
88 | | - |
89 | | - def generate_response(method, path) |
90 | | - if path == '/' && method == 'GET' |
91 | | - # Get the feature flag value |
92 | | - feature_flag_value = @featurevisor.is_enabled("my_feature") |
93 | | - |
94 | | - body = "Hello World. Feature flag value is: #{feature_flag_value}" |
95 | | - status = '200 OK' |
96 | | - content_type = "text/plain" |
97 | | - else |
98 | | - body = "Not Found" |
99 | | - status = '404 Not Found' |
100 | | - content_type = "text/plain" |
101 | | - end |
102 | | - |
103 | | - response = [ |
104 | | - "HTTP/1.1 #{status}", |
105 | | - "Content-Type: #{content_type}", |
106 | | - "Content-Length: #{body.bytesize}", |
107 | | - "Access-Control-Allow-Origin: *", |
108 | | - "Connection: close", |
109 | | - "", |
110 | | - body |
111 | | - ].join("\r\n") |
| 18 | +## |
| 19 | +# Initialize Featurevisor |
| 20 | +# |
| 21 | +datafile_url = "https://featurevisor-example-cloudflare.pages.dev/production/featurevisor-tag-all.json" |
112 | 22 |
|
113 | | - response |
114 | | - end |
| 23 | +# Fetch the datafile |
| 24 | +response = Net::HTTP.get(URI(datafile_url)) |
| 25 | +datafile_content = JSON.parse(response) |
| 26 | +symbolized_datafile = symbolize_keys(datafile_content) # @TODO: this shouldn't be required |
115 | 27 |
|
116 | | - def stop |
117 | | - @server&.close |
118 | | - puts "Server stopped." |
119 | | - end |
120 | | -end |
| 28 | +# Create Featurevisor instance |
| 29 | +featurevisor = Featurevisor.create_instance( |
| 30 | + datafile: symbolized_datafile, |
| 31 | +) |
121 | 32 |
|
122 | | -# Main execution |
123 | | -if __FILE__ == $PROGRAM_NAME |
124 | | - server = HelloWorldServer.new(3000) |
| 33 | +# Get the feature flag value |
| 34 | +feature_flag_value = featurevisor.is_enabled("my_feature") |
125 | 35 |
|
126 | | - begin |
127 | | - server.start |
128 | | - rescue Interrupt |
129 | | - puts "\nReceived interrupt signal..." |
130 | | - ensure |
131 | | - server.stop |
132 | | - end |
133 | | -end |
| 36 | +# Print results to terminal |
| 37 | +puts "Feature flag 'my_feature' is enabled: #{feature_flag_value}" |
0 commit comments