xref: /aosp_15_r20/external/curl/lib/curl_trc.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker 
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker 
27*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
28*6236dae4SAndroid Build Coastguard Worker 
29*6236dae4SAndroid Build Coastguard Worker #include "curl_trc.h"
30*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
31*6236dae4SAndroid Build Coastguard Worker #include "easyif.h"
32*6236dae4SAndroid Build Coastguard Worker #include "cfilters.h"
33*6236dae4SAndroid Build Coastguard Worker #include "timeval.h"
34*6236dae4SAndroid Build Coastguard Worker #include "multiif.h"
35*6236dae4SAndroid Build Coastguard Worker #include "strcase.h"
36*6236dae4SAndroid Build Coastguard Worker 
37*6236dae4SAndroid Build Coastguard Worker #include "cf-socket.h"
38*6236dae4SAndroid Build Coastguard Worker #include "connect.h"
39*6236dae4SAndroid Build Coastguard Worker #include "doh.h"
40*6236dae4SAndroid Build Coastguard Worker #include "http2.h"
41*6236dae4SAndroid Build Coastguard Worker #include "http_proxy.h"
42*6236dae4SAndroid Build Coastguard Worker #include "cf-h1-proxy.h"
43*6236dae4SAndroid Build Coastguard Worker #include "cf-h2-proxy.h"
44*6236dae4SAndroid Build Coastguard Worker #include "cf-haproxy.h"
45*6236dae4SAndroid Build Coastguard Worker #include "cf-https-connect.h"
46*6236dae4SAndroid Build Coastguard Worker #include "socks.h"
47*6236dae4SAndroid Build Coastguard Worker #include "strtok.h"
48*6236dae4SAndroid Build Coastguard Worker #include "vtls/vtls.h"
49*6236dae4SAndroid Build Coastguard Worker #include "vquic/vquic.h"
50*6236dae4SAndroid Build Coastguard Worker 
51*6236dae4SAndroid Build Coastguard Worker /* The last 3 #include files should be in this order */
52*6236dae4SAndroid Build Coastguard Worker #include "curl_printf.h"
53*6236dae4SAndroid Build Coastguard Worker #include "curl_memory.h"
54*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
55*6236dae4SAndroid Build Coastguard Worker 
56*6236dae4SAndroid Build Coastguard Worker #ifndef ARRAYSIZE
57*6236dae4SAndroid Build Coastguard Worker #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
58*6236dae4SAndroid Build Coastguard Worker #endif
59*6236dae4SAndroid Build Coastguard Worker 
Curl_debug(struct Curl_easy * data,curl_infotype type,char * ptr,size_t size)60*6236dae4SAndroid Build Coastguard Worker void Curl_debug(struct Curl_easy *data, curl_infotype type,
61*6236dae4SAndroid Build Coastguard Worker                 char *ptr, size_t size)
62*6236dae4SAndroid Build Coastguard Worker {
63*6236dae4SAndroid Build Coastguard Worker   if(data->set.verbose) {
64*6236dae4SAndroid Build Coastguard Worker     static const char s_infotype[CURLINFO_END][3] = {
65*6236dae4SAndroid Build Coastguard Worker       "* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
66*6236dae4SAndroid Build Coastguard Worker     if(data->set.fdebug) {
67*6236dae4SAndroid Build Coastguard Worker       bool inCallback = Curl_is_in_callback(data);
68*6236dae4SAndroid Build Coastguard Worker       Curl_set_in_callback(data, TRUE);
69*6236dae4SAndroid Build Coastguard Worker       (void)(*data->set.fdebug)(data, type, ptr, size, data->set.debugdata);
70*6236dae4SAndroid Build Coastguard Worker       Curl_set_in_callback(data, inCallback);
71*6236dae4SAndroid Build Coastguard Worker     }
72*6236dae4SAndroid Build Coastguard Worker     else {
73*6236dae4SAndroid Build Coastguard Worker       switch(type) {
74*6236dae4SAndroid Build Coastguard Worker       case CURLINFO_TEXT:
75*6236dae4SAndroid Build Coastguard Worker       case CURLINFO_HEADER_OUT:
76*6236dae4SAndroid Build Coastguard Worker       case CURLINFO_HEADER_IN:
77*6236dae4SAndroid Build Coastguard Worker         fwrite(s_infotype[type], 2, 1, data->set.err);
78*6236dae4SAndroid Build Coastguard Worker         fwrite(ptr, size, 1, data->set.err);
79*6236dae4SAndroid Build Coastguard Worker         break;
80*6236dae4SAndroid Build Coastguard Worker       default: /* nada */
81*6236dae4SAndroid Build Coastguard Worker         break;
82*6236dae4SAndroid Build Coastguard Worker       }
83*6236dae4SAndroid Build Coastguard Worker     }
84*6236dae4SAndroid Build Coastguard Worker   }
85*6236dae4SAndroid Build Coastguard Worker }
86*6236dae4SAndroid Build Coastguard Worker 
87*6236dae4SAndroid Build Coastguard Worker 
88*6236dae4SAndroid Build Coastguard Worker /* Curl_failf() is for messages stating why we failed.
89*6236dae4SAndroid Build Coastguard Worker  * The message SHALL NOT include any LF or CR.
90*6236dae4SAndroid Build Coastguard Worker  */
Curl_failf(struct Curl_easy * data,const char * fmt,...)91*6236dae4SAndroid Build Coastguard Worker void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
92*6236dae4SAndroid Build Coastguard Worker {
93*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
94*6236dae4SAndroid Build Coastguard Worker   if(data->set.verbose || data->set.errorbuffer) {
95*6236dae4SAndroid Build Coastguard Worker     va_list ap;
96*6236dae4SAndroid Build Coastguard Worker     int len;
97*6236dae4SAndroid Build Coastguard Worker     char error[CURL_ERROR_SIZE + 2];
98*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
99*6236dae4SAndroid Build Coastguard Worker     len = mvsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
100*6236dae4SAndroid Build Coastguard Worker 
101*6236dae4SAndroid Build Coastguard Worker     if(data->set.errorbuffer && !data->state.errorbuf) {
102*6236dae4SAndroid Build Coastguard Worker       strcpy(data->set.errorbuffer, error);
103*6236dae4SAndroid Build Coastguard Worker       data->state.errorbuf = TRUE; /* wrote error string */
104*6236dae4SAndroid Build Coastguard Worker     }
105*6236dae4SAndroid Build Coastguard Worker     error[len++] = '\n';
106*6236dae4SAndroid Build Coastguard Worker     error[len] = '\0';
107*6236dae4SAndroid Build Coastguard Worker     Curl_debug(data, CURLINFO_TEXT, error, len);
108*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
109*6236dae4SAndroid Build Coastguard Worker   }
110*6236dae4SAndroid Build Coastguard Worker }
111*6236dae4SAndroid Build Coastguard Worker 
112*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_VERBOSE_STRINGS)
113*6236dae4SAndroid Build Coastguard Worker 
114*6236dae4SAndroid Build Coastguard Worker /* Curl_infof() is for info message along the way */
115*6236dae4SAndroid Build Coastguard Worker #define MAXINFO 2048
116*6236dae4SAndroid Build Coastguard Worker 
117*6236dae4SAndroid Build Coastguard Worker static void trc_infof(struct Curl_easy *data, struct curl_trc_feat *feat,
118*6236dae4SAndroid Build Coastguard Worker                       const char * const fmt, va_list ap)  CURL_PRINTF(3, 0);
119*6236dae4SAndroid Build Coastguard Worker 
trc_infof(struct Curl_easy * data,struct curl_trc_feat * feat,const char * const fmt,va_list ap)120*6236dae4SAndroid Build Coastguard Worker static void trc_infof(struct Curl_easy *data, struct curl_trc_feat *feat,
121*6236dae4SAndroid Build Coastguard Worker                       const char * const fmt, va_list ap)
122*6236dae4SAndroid Build Coastguard Worker {
123*6236dae4SAndroid Build Coastguard Worker   int len = 0;
124*6236dae4SAndroid Build Coastguard Worker   char buffer[MAXINFO + 5];
125*6236dae4SAndroid Build Coastguard Worker   if(feat)
126*6236dae4SAndroid Build Coastguard Worker     len = msnprintf(buffer, (MAXINFO + 1), "[%s] ", feat->name);
127*6236dae4SAndroid Build Coastguard Worker   len += mvsnprintf(buffer + len, (MAXINFO + 1) - len, fmt, ap);
128*6236dae4SAndroid Build Coastguard Worker   if(len >= MAXINFO) { /* too long, shorten with '...' */
129*6236dae4SAndroid Build Coastguard Worker     --len;
130*6236dae4SAndroid Build Coastguard Worker     buffer[len++] = '.';
131*6236dae4SAndroid Build Coastguard Worker     buffer[len++] = '.';
132*6236dae4SAndroid Build Coastguard Worker     buffer[len++] = '.';
133*6236dae4SAndroid Build Coastguard Worker   }
134*6236dae4SAndroid Build Coastguard Worker   buffer[len++] = '\n';
135*6236dae4SAndroid Build Coastguard Worker   buffer[len] = '\0';
136*6236dae4SAndroid Build Coastguard Worker   Curl_debug(data, CURLINFO_TEXT, buffer, len);
137*6236dae4SAndroid Build Coastguard Worker }
138*6236dae4SAndroid Build Coastguard Worker 
Curl_infof(struct Curl_easy * data,const char * fmt,...)139*6236dae4SAndroid Build Coastguard Worker void Curl_infof(struct Curl_easy *data, const char *fmt, ...)
140*6236dae4SAndroid Build Coastguard Worker {
141*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
142*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_is_verbose(data)) {
143*6236dae4SAndroid Build Coastguard Worker     va_list ap;
144*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
145*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, data->state.feat, fmt, ap);
146*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
147*6236dae4SAndroid Build Coastguard Worker   }
148*6236dae4SAndroid Build Coastguard Worker }
149*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_cf_infof(struct Curl_easy * data,struct Curl_cfilter * cf,const char * fmt,...)150*6236dae4SAndroid Build Coastguard Worker void Curl_trc_cf_infof(struct Curl_easy *data, struct Curl_cfilter *cf,
151*6236dae4SAndroid Build Coastguard Worker                        const char *fmt, ...)
152*6236dae4SAndroid Build Coastguard Worker {
153*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(cf);
154*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_cf_is_verbose(cf, data)) {
155*6236dae4SAndroid Build Coastguard Worker     va_list ap;
156*6236dae4SAndroid Build Coastguard Worker     int len = 0;
157*6236dae4SAndroid Build Coastguard Worker     char buffer[MAXINFO + 2];
158*6236dae4SAndroid Build Coastguard Worker     if(data->state.feat)
159*6236dae4SAndroid Build Coastguard Worker       len += msnprintf(buffer + len, MAXINFO - len, "[%s] ",
160*6236dae4SAndroid Build Coastguard Worker                        data->state.feat->name);
161*6236dae4SAndroid Build Coastguard Worker     if(cf->sockindex)
162*6236dae4SAndroid Build Coastguard Worker       len += msnprintf(buffer + len, MAXINFO - len, "[%s-%d] ",
163*6236dae4SAndroid Build Coastguard Worker                       cf->cft->name, cf->sockindex);
164*6236dae4SAndroid Build Coastguard Worker     else
165*6236dae4SAndroid Build Coastguard Worker       len += msnprintf(buffer + len, MAXINFO - len, "[%s] ", cf->cft->name);
166*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
167*6236dae4SAndroid Build Coastguard Worker     len += mvsnprintf(buffer + len, MAXINFO - len, fmt, ap);
168*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
169*6236dae4SAndroid Build Coastguard Worker     buffer[len++] = '\n';
170*6236dae4SAndroid Build Coastguard Worker     buffer[len] = '\0';
171*6236dae4SAndroid Build Coastguard Worker     Curl_debug(data, CURLINFO_TEXT, buffer, len);
172*6236dae4SAndroid Build Coastguard Worker   }
173*6236dae4SAndroid Build Coastguard Worker }
174*6236dae4SAndroid Build Coastguard Worker 
175*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat Curl_trc_feat_read = {
176*6236dae4SAndroid Build Coastguard Worker   "READ",
177*6236dae4SAndroid Build Coastguard Worker   CURL_LOG_LVL_NONE,
178*6236dae4SAndroid Build Coastguard Worker };
179*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat Curl_trc_feat_write = {
180*6236dae4SAndroid Build Coastguard Worker   "WRITE",
181*6236dae4SAndroid Build Coastguard Worker   CURL_LOG_LVL_NONE,
182*6236dae4SAndroid Build Coastguard Worker };
183*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_read(struct Curl_easy * data,const char * fmt,...)184*6236dae4SAndroid Build Coastguard Worker void Curl_trc_read(struct Curl_easy *data, const char *fmt, ...)
185*6236dae4SAndroid Build Coastguard Worker {
186*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
187*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_ft_is_verbose(data, &Curl_trc_feat_read)) {
188*6236dae4SAndroid Build Coastguard Worker     va_list ap;
189*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
190*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, &Curl_trc_feat_read, fmt, ap);
191*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
192*6236dae4SAndroid Build Coastguard Worker   }
193*6236dae4SAndroid Build Coastguard Worker }
194*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_write(struct Curl_easy * data,const char * fmt,...)195*6236dae4SAndroid Build Coastguard Worker void Curl_trc_write(struct Curl_easy *data, const char *fmt, ...)
196*6236dae4SAndroid Build Coastguard Worker {
197*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
198*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_ft_is_verbose(data, &Curl_trc_feat_write)) {
199*6236dae4SAndroid Build Coastguard Worker     va_list ap;
200*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
201*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, &Curl_trc_feat_write, fmt, ap);
202*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
203*6236dae4SAndroid Build Coastguard Worker   }
204*6236dae4SAndroid Build Coastguard Worker }
205*6236dae4SAndroid Build Coastguard Worker 
206*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP
207*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat Curl_trc_feat_ftp = {
208*6236dae4SAndroid Build Coastguard Worker   "FTP",
209*6236dae4SAndroid Build Coastguard Worker   CURL_LOG_LVL_NONE,
210*6236dae4SAndroid Build Coastguard Worker };
211*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_ftp(struct Curl_easy * data,const char * fmt,...)212*6236dae4SAndroid Build Coastguard Worker void Curl_trc_ftp(struct Curl_easy *data, const char *fmt, ...)
213*6236dae4SAndroid Build Coastguard Worker {
214*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
215*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_ft_is_verbose(data, &Curl_trc_feat_ftp)) {
216*6236dae4SAndroid Build Coastguard Worker     va_list ap;
217*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
218*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, &Curl_trc_feat_ftp, fmt, ap);
219*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
220*6236dae4SAndroid Build Coastguard Worker   }
221*6236dae4SAndroid Build Coastguard Worker }
222*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_FTP */
223*6236dae4SAndroid Build Coastguard Worker 
224*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP
225*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat Curl_trc_feat_smtp = {
226*6236dae4SAndroid Build Coastguard Worker   "SMTP",
227*6236dae4SAndroid Build Coastguard Worker   CURL_LOG_LVL_NONE,
228*6236dae4SAndroid Build Coastguard Worker };
229*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_smtp(struct Curl_easy * data,const char * fmt,...)230*6236dae4SAndroid Build Coastguard Worker void Curl_trc_smtp(struct Curl_easy *data, const char *fmt, ...)
231*6236dae4SAndroid Build Coastguard Worker {
232*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
233*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_ft_is_verbose(data, &Curl_trc_feat_smtp)) {
234*6236dae4SAndroid Build Coastguard Worker     va_list ap;
235*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
236*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, &Curl_trc_feat_smtp, fmt, ap);
237*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
238*6236dae4SAndroid Build Coastguard Worker   }
239*6236dae4SAndroid Build Coastguard Worker }
240*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_SMTP */
241*6236dae4SAndroid Build Coastguard Worker 
242*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(CURL_DISABLE_HTTP)
243*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat Curl_trc_feat_ws = {
244*6236dae4SAndroid Build Coastguard Worker   "WS",
245*6236dae4SAndroid Build Coastguard Worker   CURL_LOG_LVL_NONE,
246*6236dae4SAndroid Build Coastguard Worker };
247*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_ws(struct Curl_easy * data,const char * fmt,...)248*6236dae4SAndroid Build Coastguard Worker void Curl_trc_ws(struct Curl_easy *data, const char *fmt, ...)
249*6236dae4SAndroid Build Coastguard Worker {
250*6236dae4SAndroid Build Coastguard Worker   DEBUGASSERT(!strchr(fmt, '\n'));
251*6236dae4SAndroid Build Coastguard Worker   if(Curl_trc_ft_is_verbose(data, &Curl_trc_feat_ws)) {
252*6236dae4SAndroid Build Coastguard Worker     va_list ap;
253*6236dae4SAndroid Build Coastguard Worker     va_start(ap, fmt);
254*6236dae4SAndroid Build Coastguard Worker     trc_infof(data, &Curl_trc_feat_ws, fmt, ap);
255*6236dae4SAndroid Build Coastguard Worker     va_end(ap);
256*6236dae4SAndroid Build Coastguard Worker   }
257*6236dae4SAndroid Build Coastguard Worker }
258*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_WEBSOCKETS && !CURL_DISABLE_HTTP */
259*6236dae4SAndroid Build Coastguard Worker 
260*6236dae4SAndroid Build Coastguard Worker #define TRC_CT_NONE        (0)
261*6236dae4SAndroid Build Coastguard Worker #define TRC_CT_PROTOCOL    (1<<(0))
262*6236dae4SAndroid Build Coastguard Worker #define TRC_CT_NETWORK     (1<<(1))
263*6236dae4SAndroid Build Coastguard Worker #define TRC_CT_PROXY       (1<<(2))
264*6236dae4SAndroid Build Coastguard Worker 
265*6236dae4SAndroid Build Coastguard Worker struct trc_feat_def {
266*6236dae4SAndroid Build Coastguard Worker   struct curl_trc_feat *feat;
267*6236dae4SAndroid Build Coastguard Worker   unsigned int category;
268*6236dae4SAndroid Build Coastguard Worker };
269*6236dae4SAndroid Build Coastguard Worker 
270*6236dae4SAndroid Build Coastguard Worker static struct trc_feat_def trc_feats[] = {
271*6236dae4SAndroid Build Coastguard Worker   { &Curl_trc_feat_read,      TRC_CT_NONE },
272*6236dae4SAndroid Build Coastguard Worker   { &Curl_trc_feat_write,     TRC_CT_NONE },
273*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP
274*6236dae4SAndroid Build Coastguard Worker   { &Curl_trc_feat_ftp,       TRC_CT_PROTOCOL },
275*6236dae4SAndroid Build Coastguard Worker #endif
276*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DOH
277*6236dae4SAndroid Build Coastguard Worker   { &Curl_doh_trc,            TRC_CT_NETWORK },
278*6236dae4SAndroid Build Coastguard Worker #endif
279*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP
280*6236dae4SAndroid Build Coastguard Worker   { &Curl_trc_feat_smtp,      TRC_CT_PROTOCOL },
281*6236dae4SAndroid Build Coastguard Worker #endif
282*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(CURL_DISABLE_HTTP)
283*6236dae4SAndroid Build Coastguard Worker   { &Curl_trc_feat_ws,        TRC_CT_PROTOCOL },
284*6236dae4SAndroid Build Coastguard Worker #endif
285*6236dae4SAndroid Build Coastguard Worker };
286*6236dae4SAndroid Build Coastguard Worker 
287*6236dae4SAndroid Build Coastguard Worker struct trc_cft_def {
288*6236dae4SAndroid Build Coastguard Worker   struct Curl_cftype *cft;
289*6236dae4SAndroid Build Coastguard Worker   unsigned int category;
290*6236dae4SAndroid Build Coastguard Worker };
291*6236dae4SAndroid Build Coastguard Worker 
292*6236dae4SAndroid Build Coastguard Worker static struct trc_cft_def trc_cfts[] = {
293*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_tcp,            TRC_CT_NETWORK },
294*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_udp,            TRC_CT_NETWORK },
295*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_unix,           TRC_CT_NETWORK },
296*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_tcp_accept,     TRC_CT_NETWORK },
297*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_happy_eyeballs, TRC_CT_NETWORK },
298*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_setup,          TRC_CT_PROTOCOL },
299*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
300*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_nghttp2,        TRC_CT_PROTOCOL },
301*6236dae4SAndroid Build Coastguard Worker #endif
302*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
303*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_ssl,            TRC_CT_NETWORK },
304*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY
305*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_ssl_proxy,      TRC_CT_PROXY },
306*6236dae4SAndroid Build Coastguard Worker #endif
307*6236dae4SAndroid Build Coastguard Worker #endif
308*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_PROXY)
309*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_HTTP)
310*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_h1_proxy,       TRC_CT_PROXY },
311*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
312*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_h2_proxy,       TRC_CT_PROXY },
313*6236dae4SAndroid Build Coastguard Worker #endif
314*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_http_proxy,     TRC_CT_PROXY },
315*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_HTTP */
316*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_haproxy,        TRC_CT_PROXY },
317*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_socks_proxy,    TRC_CT_PROXY },
318*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_PROXY */
319*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTP3
320*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_http3,          TRC_CT_PROTOCOL },
321*6236dae4SAndroid Build Coastguard Worker #endif
322*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_HTTP) && !defined(USE_HYPER)
323*6236dae4SAndroid Build Coastguard Worker   { &Curl_cft_http_connect,   TRC_CT_PROTOCOL },
324*6236dae4SAndroid Build Coastguard Worker #endif
325*6236dae4SAndroid Build Coastguard Worker };
326*6236dae4SAndroid Build Coastguard Worker 
trc_apply_level_by_name(const char * const token,int lvl)327*6236dae4SAndroid Build Coastguard Worker static void trc_apply_level_by_name(const char * const token, int lvl)
328*6236dae4SAndroid Build Coastguard Worker {
329*6236dae4SAndroid Build Coastguard Worker   size_t i;
330*6236dae4SAndroid Build Coastguard Worker 
331*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < ARRAYSIZE(trc_cfts); ++i) {
332*6236dae4SAndroid Build Coastguard Worker     if(strcasecompare(token, trc_cfts[i].cft->name)) {
333*6236dae4SAndroid Build Coastguard Worker       trc_cfts[i].cft->log_level = lvl;
334*6236dae4SAndroid Build Coastguard Worker       break;
335*6236dae4SAndroid Build Coastguard Worker     }
336*6236dae4SAndroid Build Coastguard Worker   }
337*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < ARRAYSIZE(trc_feats); ++i) {
338*6236dae4SAndroid Build Coastguard Worker     if(strcasecompare(token, trc_feats[i].feat->name)) {
339*6236dae4SAndroid Build Coastguard Worker       trc_feats[i].feat->log_level = lvl;
340*6236dae4SAndroid Build Coastguard Worker       break;
341*6236dae4SAndroid Build Coastguard Worker     }
342*6236dae4SAndroid Build Coastguard Worker   }
343*6236dae4SAndroid Build Coastguard Worker }
344*6236dae4SAndroid Build Coastguard Worker 
trc_apply_level_by_category(int category,int lvl)345*6236dae4SAndroid Build Coastguard Worker static void trc_apply_level_by_category(int category, int lvl)
346*6236dae4SAndroid Build Coastguard Worker {
347*6236dae4SAndroid Build Coastguard Worker   size_t i;
348*6236dae4SAndroid Build Coastguard Worker 
349*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < ARRAYSIZE(trc_cfts); ++i) {
350*6236dae4SAndroid Build Coastguard Worker     if(!category || (trc_cfts[i].category & category))
351*6236dae4SAndroid Build Coastguard Worker       trc_cfts[i].cft->log_level = lvl;
352*6236dae4SAndroid Build Coastguard Worker   }
353*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < ARRAYSIZE(trc_feats); ++i) {
354*6236dae4SAndroid Build Coastguard Worker     if(!category || (trc_feats[i].category & category))
355*6236dae4SAndroid Build Coastguard Worker       trc_feats[i].feat->log_level = lvl;
356*6236dae4SAndroid Build Coastguard Worker   }
357*6236dae4SAndroid Build Coastguard Worker }
358*6236dae4SAndroid Build Coastguard Worker 
trc_opt(const char * config)359*6236dae4SAndroid Build Coastguard Worker static CURLcode trc_opt(const char *config)
360*6236dae4SAndroid Build Coastguard Worker {
361*6236dae4SAndroid Build Coastguard Worker   char *token, *tok_buf, *tmp;
362*6236dae4SAndroid Build Coastguard Worker   int lvl;
363*6236dae4SAndroid Build Coastguard Worker 
364*6236dae4SAndroid Build Coastguard Worker   tmp = strdup(config);
365*6236dae4SAndroid Build Coastguard Worker   if(!tmp)
366*6236dae4SAndroid Build Coastguard Worker     return CURLE_OUT_OF_MEMORY;
367*6236dae4SAndroid Build Coastguard Worker 
368*6236dae4SAndroid Build Coastguard Worker   token = strtok_r(tmp, ", ", &tok_buf);
369*6236dae4SAndroid Build Coastguard Worker   while(token) {
370*6236dae4SAndroid Build Coastguard Worker     switch(*token) {
371*6236dae4SAndroid Build Coastguard Worker       case '-':
372*6236dae4SAndroid Build Coastguard Worker         lvl = CURL_LOG_LVL_NONE;
373*6236dae4SAndroid Build Coastguard Worker         ++token;
374*6236dae4SAndroid Build Coastguard Worker         break;
375*6236dae4SAndroid Build Coastguard Worker       case '+':
376*6236dae4SAndroid Build Coastguard Worker         lvl = CURL_LOG_LVL_INFO;
377*6236dae4SAndroid Build Coastguard Worker         ++token;
378*6236dae4SAndroid Build Coastguard Worker         break;
379*6236dae4SAndroid Build Coastguard Worker       default:
380*6236dae4SAndroid Build Coastguard Worker         lvl = CURL_LOG_LVL_INFO;
381*6236dae4SAndroid Build Coastguard Worker         break;
382*6236dae4SAndroid Build Coastguard Worker     }
383*6236dae4SAndroid Build Coastguard Worker     if(strcasecompare(token, "all"))
384*6236dae4SAndroid Build Coastguard Worker       trc_apply_level_by_category(TRC_CT_NONE, lvl);
385*6236dae4SAndroid Build Coastguard Worker     else if(strcasecompare(token, "protocol"))
386*6236dae4SAndroid Build Coastguard Worker       trc_apply_level_by_category(TRC_CT_PROTOCOL, lvl);
387*6236dae4SAndroid Build Coastguard Worker     else if(strcasecompare(token, "network"))
388*6236dae4SAndroid Build Coastguard Worker       trc_apply_level_by_category(TRC_CT_NETWORK, lvl);
389*6236dae4SAndroid Build Coastguard Worker     else if(strcasecompare(token, "proxy"))
390*6236dae4SAndroid Build Coastguard Worker       trc_apply_level_by_category(TRC_CT_PROXY, lvl);
391*6236dae4SAndroid Build Coastguard Worker     else
392*6236dae4SAndroid Build Coastguard Worker       trc_apply_level_by_name(token, lvl);
393*6236dae4SAndroid Build Coastguard Worker 
394*6236dae4SAndroid Build Coastguard Worker     token = strtok_r(NULL, ", ", &tok_buf);
395*6236dae4SAndroid Build Coastguard Worker   }
396*6236dae4SAndroid Build Coastguard Worker   free(tmp);
397*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
398*6236dae4SAndroid Build Coastguard Worker }
399*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_opt(const char * config)400*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_trc_opt(const char *config)
401*6236dae4SAndroid Build Coastguard Worker {
402*6236dae4SAndroid Build Coastguard Worker   CURLcode result = config ? trc_opt(config) : CURLE_OK;
403*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
404*6236dae4SAndroid Build Coastguard Worker   /* CURL_DEBUG can override anything */
405*6236dae4SAndroid Build Coastguard Worker   if(!result) {
406*6236dae4SAndroid Build Coastguard Worker     const char *dbg_config = getenv("CURL_DEBUG");
407*6236dae4SAndroid Build Coastguard Worker     if(dbg_config)
408*6236dae4SAndroid Build Coastguard Worker       result = trc_opt(dbg_config);
409*6236dae4SAndroid Build Coastguard Worker   }
410*6236dae4SAndroid Build Coastguard Worker #endif /* DEBUGBUILD */
411*6236dae4SAndroid Build Coastguard Worker   return result;
412*6236dae4SAndroid Build Coastguard Worker }
413*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_init(void)414*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_trc_init(void)
415*6236dae4SAndroid Build Coastguard Worker {
416*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
417*6236dae4SAndroid Build Coastguard Worker   return Curl_trc_opt(NULL);
418*6236dae4SAndroid Build Coastguard Worker #else
419*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
420*6236dae4SAndroid Build Coastguard Worker #endif
421*6236dae4SAndroid Build Coastguard Worker }
422*6236dae4SAndroid Build Coastguard Worker 
423*6236dae4SAndroid Build Coastguard Worker #else /* defined(CURL_DISABLE_VERBOSE_STRINGS) */
424*6236dae4SAndroid Build Coastguard Worker 
Curl_trc_init(void)425*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_trc_init(void)
426*6236dae4SAndroid Build Coastguard Worker {
427*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
428*6236dae4SAndroid Build Coastguard Worker }
429*6236dae4SAndroid Build Coastguard Worker 
430*6236dae4SAndroid Build Coastguard Worker #endif /* !defined(CURL_DISABLE_VERBOSE_STRINGS) */
431