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