mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-10-04 00:00:37 -04:00
allow redacting only headers of value
the option can be set to or to define that
This commit is contained in:
parent
410874bd11
commit
92964d6380
@ -114,7 +114,7 @@ module HTTPX
|
||||
@parser.http_version.join("."),
|
||||
headers)
|
||||
log(color: :yellow) { "-> HEADLINE: #{response.status} HTTP/#{@parser.http_version.join(".")}" }
|
||||
log(color: :yellow) { response.headers.each.map { |f, v| "-> HEADER: #{f}: #{log_redact(v)}" }.join("\n") }
|
||||
log(color: :yellow) { response.headers.each.map { |f, v| "-> HEADER: #{f}: #{log_redact_headers(v)}" }.join("\n") }
|
||||
|
||||
@request.response = response
|
||||
on_complete if response.finished?
|
||||
@ -126,7 +126,7 @@ module HTTPX
|
||||
response = @request.response
|
||||
log(level: 2) { "trailer headers received" }
|
||||
|
||||
log(color: :yellow) { h.each.map { |f, v| "-> HEADER: #{f}: #{log_redact(v.join(", "))}" }.join("\n") }
|
||||
log(color: :yellow) { h.each.map { |f, v| "-> HEADER: #{f}: #{log_redact_headers(v.join(", "))}" }.join("\n") }
|
||||
response.merge_headers(h)
|
||||
end
|
||||
|
||||
@ -136,7 +136,7 @@ module HTTPX
|
||||
return unless request
|
||||
|
||||
log(color: :green) { "-> DATA: #{chunk.bytesize} bytes..." }
|
||||
log(level: 2, color: :green) { "-> #{log_redact(chunk.inspect)}" }
|
||||
log(level: 2, color: :green) { "-> #{log_redact_body(chunk.inspect)}" }
|
||||
response = request.response
|
||||
|
||||
response << chunk
|
||||
@ -360,7 +360,7 @@ module HTTPX
|
||||
|
||||
while (chunk = request.drain_body)
|
||||
log(color: :green) { "<- DATA: #{chunk.bytesize} bytes..." }
|
||||
log(level: 2, color: :green) { "<- #{log_redact(chunk.inspect)}" }
|
||||
log(level: 2, color: :green) { "<- #{log_redact_body(chunk.inspect)}" }
|
||||
@buffer << chunk
|
||||
throw(:buffer_full, request) if @buffer.full?
|
||||
end
|
||||
@ -381,7 +381,7 @@ module HTTPX
|
||||
def join_headers2(headers)
|
||||
headers.each do |field, value|
|
||||
field = capitalized(field)
|
||||
log(color: :yellow) { "<- HEADER: #{[field, log_redact(value)].join(": ")}" }
|
||||
log(color: :yellow) { "<- HEADER: #{[field, log_redact_headers(value)].join(": ")}" }
|
||||
@buffer << "#{field}: #{value}#{CRLF}"
|
||||
end
|
||||
end
|
||||
|
@ -234,12 +234,12 @@ module HTTPX
|
||||
extra_headers = set_protocol_headers(request)
|
||||
|
||||
if request.headers.key?("host")
|
||||
log { "forbidden \"host\" header found (#{log_redact(request.headers["host"])}), will use it as authority..." }
|
||||
log { "forbidden \"host\" header found (#{log_redact_headers(request.headers["host"])}), will use it as authority..." }
|
||||
extra_headers[":authority"] = request.headers["host"]
|
||||
end
|
||||
|
||||
log(level: 1, color: :yellow) do
|
||||
"\n#{request.headers.merge(extra_headers).each.map { |k, v| "#{stream.id}: -> HEADER: #{k}: #{log_redact(v)}" }.join("\n")}"
|
||||
"\n#{request.headers.merge(extra_headers).each.map { |k, v| "#{stream.id}: -> HEADER: #{k}: #{log_redact_headers(v)}" }.join("\n")}"
|
||||
end
|
||||
stream.headers(request.headers.each(extra_headers), end_stream: request.body.empty?)
|
||||
end
|
||||
@ -251,7 +251,7 @@ module HTTPX
|
||||
end
|
||||
|
||||
log(level: 1, color: :yellow) do
|
||||
request.trailers.each.map { |k, v| "#{stream.id}: -> HEADER: #{k}: #{log_redact(v)}" }.join("\n")
|
||||
request.trailers.each.map { |k, v| "#{stream.id}: -> HEADER: #{k}: #{log_redact_headers(v)}" }.join("\n")
|
||||
end
|
||||
stream.headers(request.trailers.each, end_stream: true)
|
||||
end
|
||||
@ -279,7 +279,7 @@ module HTTPX
|
||||
|
||||
def send_chunk(request, stream, chunk, next_chunk)
|
||||
log(level: 1, color: :green) { "#{stream.id}: -> DATA: #{chunk.bytesize} bytes..." }
|
||||
log(level: 2, color: :green) { "#{stream.id}: -> #{log_redact(chunk.inspect)}" }
|
||||
log(level: 2, color: :green) { "#{stream.id}: -> #{log_redact_body(chunk.inspect)}" }
|
||||
stream.data(chunk, end_stream: end_stream?(request, next_chunk))
|
||||
end
|
||||
|
||||
@ -300,7 +300,7 @@ module HTTPX
|
||||
end
|
||||
|
||||
log(color: :yellow) do
|
||||
h.map { |k, v| "#{stream.id}: <- HEADER: #{k}: #{log_redact(v)}" }.join("\n")
|
||||
h.map { |k, v| "#{stream.id}: <- HEADER: #{k}: #{log_redact_headers(v)}" }.join("\n")
|
||||
end
|
||||
_, status = h.shift
|
||||
headers = request.options.headers_class.new(h)
|
||||
@ -313,14 +313,14 @@ module HTTPX
|
||||
|
||||
def on_stream_trailers(stream, response, h)
|
||||
log(color: :yellow) do
|
||||
h.map { |k, v| "#{stream.id}: <- HEADER: #{k}: #{log_redact(v)}" }.join("\n")
|
||||
h.map { |k, v| "#{stream.id}: <- HEADER: #{k}: #{log_redact_headers(v)}" }.join("\n")
|
||||
end
|
||||
response.merge_headers(h)
|
||||
end
|
||||
|
||||
def on_stream_data(stream, request, data)
|
||||
log(level: 1, color: :green) { "#{stream.id}: <- DATA: #{data.bytesize} bytes..." }
|
||||
log(level: 2, color: :green) { "#{stream.id}: <- #{log_redact(data.inspect)}" }
|
||||
log(level: 2, color: :green) { "#{stream.id}: <- #{log_redact_body(data.inspect)}" }
|
||||
request.response << data
|
||||
end
|
||||
|
||||
@ -409,7 +409,7 @@ module HTTPX
|
||||
when :data
|
||||
frame.merge(payload: frame[:payload].bytesize)
|
||||
when :headers, :ping
|
||||
frame.merge(payload: log_redact(frame[:payload]))
|
||||
frame.merge(payload: log_redact_headers(frame[:payload]))
|
||||
else
|
||||
frame
|
||||
end
|
||||
@ -425,7 +425,7 @@ module HTTPX
|
||||
when :data
|
||||
frame.merge(payload: frame[:payload].bytesize)
|
||||
when :headers, :ping
|
||||
frame.merge(payload: log_redact(frame[:payload]))
|
||||
frame.merge(payload: log_redact_headers(frame[:payload]))
|
||||
else
|
||||
frame
|
||||
end
|
||||
@ -435,7 +435,7 @@ module HTTPX
|
||||
|
||||
def on_altsvc(origin, frame)
|
||||
log(level: 2) { "#{frame[:stream]}: altsvc frame was received" }
|
||||
log(level: 2) { "#{frame[:stream]}: #{log_redact(frame.inspect)}" }
|
||||
log(level: 2) { "#{frame[:stream]}: #{log_redact_headers(frame.inspect)}" }
|
||||
alt_origin = URI.parse("#{frame[:proto]}://#{frame[:host]}:#{frame[:port]}")
|
||||
params = { "ma" => frame[:max_age] }
|
||||
emit(:altsvc, origin, alt_origin, origin, params)
|
||||
|
@ -47,7 +47,17 @@ module HTTPX
|
||||
log(level: level, color: color, debug_level: debug_level, debug: debug) { ex.full_message }
|
||||
end
|
||||
|
||||
def log_redact(text, should_redact = @options.debug_redact)
|
||||
def log_redact_headers(text)
|
||||
log_redact(text, @options.debug_redact == :headers)
|
||||
end
|
||||
|
||||
def log_redact_body(text)
|
||||
log_redact(text, @options.debug_redact == :body)
|
||||
end
|
||||
|
||||
def log_redact(text, should_redact)
|
||||
should_redact ||= @options.debug_redact == true
|
||||
|
||||
return text.to_s unless should_redact
|
||||
|
||||
"[REDACTED]"
|
||||
|
@ -12,6 +12,10 @@ module HTTPX
|
||||
|
||||
def log_exception: (Exception error, ?level: Integer, ?color: Symbol, ?debug_level: Integer, ?debug: _IOLogger?) -> void
|
||||
|
||||
def log_redact: (_ToS text, ?bool should_redact) -> String
|
||||
def log_redact_headers: (_ToS text) -> String
|
||||
|
||||
def log_redact_body: (_ToS text) -> String
|
||||
|
||||
def log_redact: (_ToS text, bool should_redact) -> String
|
||||
end
|
||||
end
|
@ -20,6 +20,7 @@ module HTTPX
|
||||
|
||||
type timeout_type = :connect_timeout | :settings_timeout | :close_handshake_timeout | :operation_timeout | :keep_alive_timeout | :read_timeout | :write_timeout | :request_timeout
|
||||
type timeout = Hash[timeout_type, Numeric?]
|
||||
type redact_value = :headers | :body | bool
|
||||
|
||||
def self.new: (?options) -> instance
|
||||
|
||||
@ -175,7 +176,7 @@ module HTTPX
|
||||
def option_io: (io_option value) -> io_option
|
||||
def option_fallback_protocol: (String value) -> String
|
||||
def option_debug: (_IOLogger value) -> _IOLogger
|
||||
def option_debug_redact: (bool value) -> bool
|
||||
def option_debug_redact: (redact_value value) -> redact_value
|
||||
def option_compress_request_body: (bool value) -> bool
|
||||
def option_decompress_response_body: (bool value) -> bool
|
||||
def option_persistent: (bool value) -> bool
|
||||
|
@ -73,6 +73,39 @@ class HTTPTest < Minitest::Test
|
||||
assert log_output.include?("HEADLINE: 200 HTTP/1.1")
|
||||
assert log_output.include?("HEADER: content-type: [REDACTED]")
|
||||
assert log_output.include?("HEADER: content-length: [REDACTED]")
|
||||
assert log_output.include?("-> [REDACTED]"), "data should be redacted"
|
||||
|
||||
# headers only
|
||||
log = StringIO.new
|
||||
response = HTTPX.plugin(SessionWithPool).get(uri, debug: log, debug_level: 3, debug_redact: :headers)
|
||||
verify_status(response, 200)
|
||||
log_output = log.string
|
||||
# assert request headers
|
||||
assert log_output.include?("HEADLINE: \"GET #{uri.path} HTTP/1.1\"")
|
||||
assert log_output.include?("HEADER: Accept: [REDACTED]")
|
||||
assert log_output.include?("HEADER: Host: [REDACTED]")
|
||||
assert log_output.include?("HEADER: Connection: [REDACTED]")
|
||||
# assert response headers
|
||||
assert log_output.include?("HEADLINE: 200 HTTP/1.1")
|
||||
assert log_output.include?("HEADER: content-type: [REDACTED]")
|
||||
assert log_output.include?("HEADER: content-length: [REDACTED]")
|
||||
assert !log_output.include?("-> [REDACTED]"), "data should not be redacted"
|
||||
|
||||
# body only
|
||||
log = StringIO.new
|
||||
response = HTTPX.plugin(SessionWithPool).get(uri, debug: log, debug_level: 3, debug_redact: :body)
|
||||
verify_status(response, 200)
|
||||
log_output = log.string
|
||||
# assert request headers
|
||||
assert log_output.include?("HEADLINE: \"GET #{uri.path} HTTP/1.1\"")
|
||||
assert !log_output.include?("HEADER: Accept: [REDACTED]")
|
||||
assert !log_output.include?("HEADER: Host: [REDACTED]")
|
||||
assert !log_output.include?("HEADER: Connection: [REDACTED]")
|
||||
# assert response headers
|
||||
assert log_output.include?("HEADLINE: 200 HTTP/1.1")
|
||||
assert !log_output.include?("HEADER: content-type: [REDACTED]")
|
||||
assert !log_output.include?("HEADER: content-length: [REDACTED]")
|
||||
assert log_output.include?("-> [REDACTED]"), "data should be redacted"
|
||||
end
|
||||
|
||||
def test_debug_with_and_without_color_codes
|
||||
|
Loading…
x
Reference in New Issue
Block a user