560
}
561
#endif
562
563
-static void redact_sensitive_header(struct strbuf *header)
563
+/* Return 1 if redactions have been made, 0 otherwise. */
564
+static int redact_sensitive_header(struct strbuf *header, size_t offset)
565
{
566
+ int ret = 0;
567
const char *sensitive_header;
568
569
if (trace_curl_redact &&
568
- (skip_iprefix(header->buf, "Authorization:", &sensitive_header) ||
569
- skip_iprefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
570
+ (skip_iprefix(header->buf + offset, "Authorization:", &sensitive_header) ||
571
+ skip_iprefix(header->buf + offset, "Proxy-Authorization:", &sensitive_header))) {
572
/* The first token is the type, which is OK to log */
573
while (isspace(*sensitive_header))
574
sensitive_header++;
577
/* Everything else is opaque and possibly sensitive */
578
strbuf_setlen(header, sensitive_header - header->buf);
579
strbuf_addstr(header, " <redacted>");
580
+ ret = 1;
581
} else if (trace_curl_redact &&
579
- skip_iprefix(header->buf, "Cookie:", &sensitive_header)) {
582
+ skip_iprefix(header->buf + offset, "Cookie:", &sensitive_header)) {
583
struct strbuf redacted_header = STRBUF_INIT;
584
const char *cookie;
585
615
616
strbuf_setlen(header, sensitive_header - header->buf);
617
strbuf_addbuf(header, &redacted_header);
618
+ ret = 1;
619
+ }
620
+ return ret;
621
+}
622
+
623
+/* Redact headers in info */
624
+static void redact_sensitive_info_header(struct strbuf *header)
625
+{
626
+ const char *sensitive_header;
627
+
628
+ /*
629
+ * curl's h2h3 prints headers in info, e.g.:
630
+ * h2h3 [<header-name>: <header-val>]
631
+ */
632
+ if (trace_curl_redact &&
633
+ skip_iprefix(header->buf, "h2h3 [", &sensitive_header)) {
634
+ if (redact_sensitive_header(header, sensitive_header - header->buf)) {
635
+ /* redaction ate our closing bracket */
636
+ strbuf_addch(header, ']');
637
+ }
638
}
639
}
640
652
653
for (header = headers; *header; header++) {
654
if (hide_sensitive_header)
632
- redact_sensitive_header(*header);
655
+ redact_sensitive_header(*header, 0);
656
strbuf_insertstr((*header), 0, text);
657
strbuf_insertstr((*header), strlen(text), ": ");
658
strbuf_rtrim((*header));
691
strbuf_release(&out);
692
}
693
694
+static void curl_dump_info(char *data, size_t size)
695
+{
696
+ struct strbuf buf = STRBUF_INIT;
697
+
698
+ strbuf_add(&buf, data, size);
699
+
700
+ redact_sensitive_info_header(&buf);
701
+ trace_printf_key(&trace_curl, "== Info: %s", buf.buf);
702
+
703
+ strbuf_release(&buf);
704
+}
705
+
706
static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
707
{
708
const char *text;
710
711
switch (type) {
712
case CURLINFO_TEXT:
678
- trace_printf_key(&trace_curl, "== Info: %s", data);
713
+ curl_dump_info(data, size);
714
break;
715
case CURLINFO_HEADER_OUT:
716
text = "=> Send header";