Skip to content

Commit 44ec605

Browse files
committed
Make encoding values in UTF-8 more robust
Do not crash on invalid unicode values
1 parent ad1fbfd commit 44ec605

File tree

3 files changed

+12
-15
lines changed

3 files changed

+12
-15
lines changed

lib/logtail-rack/http_context.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "logtail/contexts/http"
22
require "logtail/current_context"
33
require "logtail-rack/middleware"
4+
require "logtail-rack/util/encoding"
45
require "logtail-rack/util/request"
56

67
module Logtail
@@ -11,10 +12,10 @@ class HTTPContext < Middleware
1112
def call(env)
1213
request = Util::Request.new(env)
1314
context = Contexts::HTTP.new(
14-
host: request.host.force_encoding('UTF-8'),
15-
method: request.request_method.force_encoding('UTF-8'),
15+
host: Util::Encoding.force_utf8_encoding(request),
16+
method: Util::Encoding.force_utf8_encoding(request.request_method),
1617
path: request.path,
17-
remote_addr: request.ip.force_encoding('UTF-8'),
18+
remote_addr: Util::Encoding.force_utf8_encoding(request.ip),
1819
request_id: request.request_id
1920
)
2021

lib/logtail-rack/http_events.rb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
require "logtail-rack/http_request"
77
require "logtail-rack/http_response"
88
require "logtail-rack/middleware"
9+
require "logtail-rack/util/encoding"
910

1011
module Logtail
1112
module Integrations
@@ -179,13 +180,13 @@ def call(env)
179180
body: event_body,
180181
content_length: safe_to_i(request.content_length),
181182
headers: filter_http_headers(request.headers),
182-
host: force_encoding(request.host),
183+
host: Util::Encoding.force_utf8_encoding(request.host),
183184
method: request.request_method,
184185
path: request.path,
185186
port: request.port,
186-
query_string: force_encoding(request.query_string),
187+
query_string: Util::Encoding.force_utf8_encoding(request.query_string),
187188
request_id: request.request_id,
188-
scheme: force_encoding(request.scheme),
189+
scheme: Util::Encoding.force_utf8_encoding(request.scheme),
189190
)
190191

191192
{
@@ -277,14 +278,6 @@ def filter_http_headers(headers)
277278
def safe_to_i(val)
278279
val.nil? ? nil : val.to_i
279280
end
280-
281-
def force_encoding(value)
282-
if value.respond_to?(:force_encoding)
283-
value.dup.force_encoding('UTF-8')
284-
else
285-
value
286-
end
287-
end
288281
end
289282
end
290283
end

lib/logtail-rack/util/encoding.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ module Util
33
class Encoding
44
def self.force_utf8_encoding(data)
55
if data.respond_to?(:force_encoding)
6-
data.dup.force_encoding('UTF-8')
6+
encoded_data = data.dup.force_encoding('UTF-8')
7+
encoded_data = data.dup.force_encoding("ISO-8859-1").encode("UTF-8") unless encoded_data.valid_encoding?
8+
encoded_data = data.dup.encode('UTF-8', invalid: :replace, undef: :replace) unless encoded_data.valid_encoding?
9+
encoded_data
710
elsif data.respond_to?(:transform_values)
811
data.transform_values { |val| Logtail::Util::Encoding.force_utf8_encoding(val) }
912
else

0 commit comments

Comments
 (0)