///|
pub struct DebugSnapshot {
canonical : String
expected_signature : String
actual_signature : String
masked_secret : String
headers : String
} derive(Eq, Debug)
///|
pub fn DebugSnapshot::new(
canonical : String,
expected_signature : String,
actual_signature : String,
masked_secret : String,
headers : String,
) -> DebugSnapshot {
{ canonical, expected_signature, actual_signature, masked_secret, headers }
}
///|
pub fn debug_snapshot(
request : WebhookRequest,
policy : VerificationPolicy,
) -> DebugSnapshot {
DebugSnapshot::new(
canonical_base(request, policy.provider),
expected_signature(request, policy),
request.signature(policy.provider.signature_header),
mask_secret(policy.secret),
headers_to_text(request.headers),
)
}
///|
pub fn debug_snapshot_text(snapshot : DebugSnapshot) -> String {
let builder = StringBuilder::new()
builder.write_string("secret=")
builder.write_string(snapshot.masked_secret)
builder.write_string("\nexpected=")
builder.write_string(snapshot.expected_signature)
builder.write_string("\nactual=")
builder.write_string(snapshot.actual_signature)
builder.write_string("\nheaders=\n")
builder.write_string(snapshot.headers)
builder.write_string("canonical=\n")
builder.write_string(snapshot.canonical)
builder.to_string()
}
///|
pub fn explain_verification(
request : WebhookRequest,
policy : VerificationPolicy,
) -> String {
let result = verify_request(request, policy)
let snapshot = debug_snapshot(request, policy)
let builder = StringBuilder::new()
builder.write_string(result.to_text())
builder.write_string("\n")
builder.write_string(result_help(result))
builder.write_string(debug_snapshot_text(snapshot))
builder.to_string()
}