Coverage Report

Created: 2026-05-21 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/trafficserver/build/include/ts/apidefs.h
Line
Count
Source
1
/** @file
2
3
  This header file defines common types that can be shared
4
  between internal code and TS APIs.
5
6
  @section license License
7
8
  Licensed to the Apache Software Foundation (ASF) under one
9
  or more contributor license agreements.  See the NOTICE file
10
  distributed with this work for additional information
11
  regarding copyright ownership.  The ASF licenses this file
12
  to you under the Apache License, Version 2.0 (the
13
  "License"); you may not use this file except in compliance
14
  with the License.  You may obtain a copy of the License at
15
16
      http://www.apache.org/licenses/LICENSE-2.0
17
18
  Unless required by applicable law or agreed to in writing, software
19
  distributed under the License is distributed on an "AS IS" BASIS,
20
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
  See the License for the specific language governing permissions and
22
  limitations under the License.
23
24
  @section developers Developers
25
26
  Developers, when adding a new element to an enum, append it. DO NOT
27
  insert it.  Otherwise, binary compatibility of plugins will be broken!
28
29
 */
30
31
#pragma once
32
33
/*
34
 * ATS Plugin just needs to include <ts/ts.h>,
35
 * should not include this file directly!
36
 *
37
 */
38
39
/* GENERATED FILE WARNING!  DO NOT EDIT apidefs.h
40
 *
41
 * You must modify apidefs.h.in instead.
42
 *
43
 */
44
45
#include <cstdint>
46
#include <functional>
47
#include <memory>
48
#include <vector>
49
#include <netinet/in.h>
50
#include <sys/types.h>
51
#include <sys/socket.h>
52
#include <tuple>
53
#include <type_traits>
54
55
/** Apply printf format string compile-time argument checking to a function.
56
 *
57
 *
58
 * For example, given the following function from DiagsTypes.h:
59
 *
60
 * @code
61
 * class Diags {
62
 *
63
 * ...
64
 *
65
 * void
66
 * print(
67
 *     const char *tag,
68
 *     DiagsLevel level,
69
 *     const SourceLocation *loc,
70
 *     const char *fmt,
71
 *     ...) const;
72
 *
73
 * ...
74
 *
75
 * };
76
 * @endcode
77
 *
78
 * This macro can be used to apply compiler checking for ... against the fmt
79
 * argument like so:
80
 *
81
 *
82
 * @code
83
 * class Diags {
84
 *
85
 * ...
86
 *
87
 * void
88
 * print(
89
 *     const char *tag,
90
 *     DiagsLevel level,
91
 *     const SourceLocation *loc,
92
 *     const char *fmt,
93
 *     ...) const TS_PRINTFLIKE(5, 6);
94
 *
95
 * ...
96
 *
97
 * };
98
 * @endcode
99
 *
100
 * Note in this case, (5, 6) rather than (4, 5) is passed because `this`
101
 * counts as the implicit first parameter of this member function.
102
 *
103
 * @param[in] fmt_index The index of the format string argument, with argument
104
 * indexing starting at 1.
105
 *
106
 * @param[in] arg_index The index of the first format argument string, with
107
 * argument indexing starting at 1.
108
 */
109
#if !defined(TS_PRINTFLIKE)
110
#if defined(__GNUC__) || defined(__clang__)
111
#define TS_PRINTFLIKE(fmt_index, arg_index) __attribute__((format(printf, fmt_index, arg_index)))
112
#else
113
#define TS_PRINTFLIKE(fmt_index, arg_index)
114
#endif
115
#endif
116
117
#if !defined(TS_NORETURN)
118
#if defined(__GNUC__) || defined(__clang__)
119
#define TS_NORETURN __attribute__((noreturn))
120
#else
121
#define TS_NORETURN
122
#endif
123
#endif
124
125
/* Version info
126
 *
127
 * Version numbers need to be preprocessor symbols for conditional compilation.
128
 */
129
/* clang-format off */
130
char const TS_VERSION_STRING[] = "11.0.0";
131
#define TS_VERSION_NUMBER 11000000
132
#define TS_VERSION_MAJOR 11
133
#define TS_VERSION_MINOR 0
134
#define TS_VERSION_MICRO 0
135
/* clang-format on */
136
137
constexpr long
138
TS_HTTP_VERSION(int a, int b)
139
0
{
140
0
  return ((long(a) & 0xFFFF) << 16) | (b & 0xFFFF);
141
0
}
142
constexpr int
143
TS_HTTP_MINOR(long v)
144
0
{
145
0
  return int(v & 0xFFFF);
146
0
}
147
constexpr int
148
TS_HTTP_MAJOR(long v)
149
0
{
150
0
  return int((v >> 16) & 0xFFFF);
151
0
}
152
153
#ifndef TS_RES_MEM_PATH
154
#define __TS_RES_PATH(x) #x
155
#define _TS_RES_PATH(x)  __TS_RES_PATH(x)
156
#define TS_RES_PATH(x)   x __FILE__ ":" _TS_RES_PATH(__LINE__)
157
#define TS_RES_MEM_PATH  TS_RES_PATH("memory/")
158
#endif
159
160
/**
161
    The following struct is used by TSPluginRegister(). It stores
162
    registration information about the plugin.
163
164
 */
165
struct TSPluginRegistrationInfo {
166
  const char *plugin_name;
167
  const char *vendor_name;
168
  const char *support_email;
169
};
170
171
struct TSPluginMsg {
172
  const char *tag;       ///< Message tag (null terminated).
173
  void const *data;      ///< Message data (payload)
174
  size_t      data_size; ///< Amount of message data.
175
};
176
177
/**
178
    This set of enums are possible values returned by
179
    TSHttpHdrParseReq() and TSHttpHdrParseResp().
180
181
 */
182
enum TSParseResult {
183
  TS_PARSE_ERROR = -1,
184
  TS_PARSE_DONE  = 0,
185
  TS_PARSE_CONT  = 1,
186
};
187
188
/**
189
    This set of enums represents the possible HTTP types that
190
    can be assigned to an HTTP header. When a header is created
191
    with TSHttpHdrCreate(), it is automatically assigned a type of
192
    TS_HTTP_TYPE_UNKNOWN. You can modify the HTTP type ONCE after it
193
    the header is created, using TSHttpHdrTypeSet(). After setting the
194
    HTTP type once, you cannot set it again. Use TSHttpHdrTypeGet()
195
    to obtain the TSHttpType of an HTTP header.
196
197
 */
198
enum TSHttpType {
199
  TS_HTTP_TYPE_UNKNOWN,
200
  TS_HTTP_TYPE_REQUEST,
201
  TS_HTTP_TYPE_RESPONSE,
202
};
203
204
/**
205
    This set of enums represents possible return values from
206
    TSHttpHdrStatusGet(), which retrieves the status code from an
207
    HTTP response header (TSHttpHdrStatusGet() retrieves status codes
208
    only from headers of type TS_HTTP_TYPE_RESPONSE). You can also set
209
    the TSHttpStatus of a response header using TSHttpHdrStatusSet().
210
211
 */
212
enum TSHttpStatus {
213
  TS_HTTP_STATUS_NONE                            = 0,
214
  TS_HTTP_STATUS_CONTINUE                        = 100,
215
  TS_HTTP_STATUS_SWITCHING_PROTOCOL              = 101,
216
  TS_HTTP_STATUS_EARLY_HINTS                     = 103,
217
  TS_HTTP_STATUS_OK                              = 200,
218
  TS_HTTP_STATUS_CREATED                         = 201,
219
  TS_HTTP_STATUS_ACCEPTED                        = 202,
220
  TS_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION   = 203,
221
  TS_HTTP_STATUS_NO_CONTENT                      = 204,
222
  TS_HTTP_STATUS_RESET_CONTENT                   = 205,
223
  TS_HTTP_STATUS_PARTIAL_CONTENT                 = 206,
224
  TS_HTTP_STATUS_MULTI_STATUS                    = 207,
225
  TS_HTTP_STATUS_ALREADY_REPORTED                = 208,
226
  TS_HTTP_STATUS_IM_USED                         = 211,
227
  TS_HTTP_STATUS_MULTIPLE_CHOICES                = 300,
228
  TS_HTTP_STATUS_MOVED_PERMANENTLY               = 301,
229
  TS_HTTP_STATUS_MOVED_TEMPORARILY               = 302,
230
  TS_HTTP_STATUS_SEE_OTHER                       = 303,
231
  TS_HTTP_STATUS_NOT_MODIFIED                    = 304,
232
  TS_HTTP_STATUS_USE_PROXY                       = 305,
233
  TS_HTTP_STATUS_TEMPORARY_REDIRECT              = 307,
234
  TS_HTTP_STATUS_PERMANENT_REDIRECT              = 308,
235
  TS_HTTP_STATUS_BAD_REQUEST                     = 400,
236
  TS_HTTP_STATUS_UNAUTHORIZED                    = 401,
237
  TS_HTTP_STATUS_PAYMENT_REQUIRED                = 402,
238
  TS_HTTP_STATUS_FORBIDDEN                       = 403,
239
  TS_HTTP_STATUS_NOT_FOUND                       = 404,
240
  TS_HTTP_STATUS_METHOD_NOT_ALLOWED              = 405,
241
  TS_HTTP_STATUS_NOT_ACCEPTABLE                  = 406,
242
  TS_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED   = 407,
243
  TS_HTTP_STATUS_REQUEST_TIMEOUT                 = 408,
244
  TS_HTTP_STATUS_CONFLICT                        = 409,
245
  TS_HTTP_STATUS_GONE                            = 410,
246
  TS_HTTP_STATUS_LENGTH_REQUIRED                 = 411,
247
  TS_HTTP_STATUS_PRECONDITION_FAILED             = 412,
248
  TS_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE        = 413,
249
  TS_HTTP_STATUS_REQUEST_URI_TOO_LONG            = 414,
250
  TS_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE          = 415,
251
  TS_HTTP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE = 416,
252
  TS_HTTP_STATUS_EXPECTATION_FAILED              = 417,
253
  TS_HTTP_STATUS_UNPROCESSABLE_ENTITY            = 422,
254
  TS_HTTP_STATUS_LOCKED                          = 423,
255
  TS_HTTP_STATUS_FAILED_DEPENDENCY               = 424,
256
  TS_HTTP_STATUS_UPGRADE_REQUIRED                = 426,
257
  TS_HTTP_STATUS_PRECONDITION_REQUIRED           = 428,
258
  TS_HTTP_STATUS_TOO_MANY_REQUESTS               = 429,
259
  TS_HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
260
  TS_HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS   = 451,
261
  TS_HTTP_STATUS_INTERNAL_SERVER_ERROR           = 500,
262
  TS_HTTP_STATUS_NOT_IMPLEMENTED                 = 501,
263
  TS_HTTP_STATUS_BAD_GATEWAY                     = 502,
264
  TS_HTTP_STATUS_SERVICE_UNAVAILABLE             = 503,
265
  TS_HTTP_STATUS_GATEWAY_TIMEOUT                 = 504,
266
  TS_HTTP_STATUS_HTTPVER_NOT_SUPPORTED           = 505,
267
  TS_HTTP_STATUS_VARIANT_ALSO_NEGOTIATES         = 506,
268
  TS_HTTP_STATUS_INSUFFICIENT_STORAGE            = 507,
269
  TS_HTTP_STATUS_LOOP_DETECTED                   = 508,
270
  TS_HTTP_STATUS_NOT_EXTENDED                    = 510,
271
  TS_HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED = 511,
272
};
273
274
/**
275
    TSEvents are sent to continuations when they are called back.
276
    The TSEvent provides the continuation's handler function with
277
    information about the callback. Based on the event it receives,
278
    the handler function can decide what to do.
279
 */
280
enum TSEvent {
281
  TS_EVENT_NONE      = 0,
282
  TS_EVENT_IMMEDIATE = 1,
283
  TS_EVENT_TIMEOUT   = 2,
284
  TS_EVENT_ERROR     = 3,
285
  TS_EVENT_CONTINUE  = 4,
286
287
  TS_EVENT_VCONN_READ_READY         = 100,
288
  TS_EVENT_VCONN_WRITE_READY        = 101,
289
  TS_EVENT_VCONN_READ_COMPLETE      = 102,
290
  TS_EVENT_VCONN_WRITE_COMPLETE     = 103,
291
  TS_EVENT_VCONN_EOS                = 104,
292
  TS_EVENT_VCONN_INACTIVITY_TIMEOUT = 105,
293
  TS_EVENT_VCONN_ACTIVE_TIMEOUT     = 106,
294
  TS_EVENT_VCONN_START              = 107,
295
  TS_EVENT_VCONN_CLOSE              = 108,
296
  TS_EVENT_VCONN_OUTBOUND_START     = 109,
297
  TS_EVENT_VCONN_OUTBOUND_CLOSE     = 110,
298
  TS_EVENT_VCONN_PRE_ACCEPT         = TS_EVENT_VCONN_START, // Deprecated but still compatible
299
300
  TS_EVENT_NET_CONNECT        = 200,
301
  TS_EVENT_NET_CONNECT_FAILED = 201,
302
  TS_EVENT_NET_ACCEPT         = 202,
303
  TS_EVENT_NET_ACCEPT_FAILED  = 204,
304
305
  TS_EVENT_HOST_LOOKUP = 500,
306
307
  TS_EVENT_CACHE_OPEN_READ              = 1102,
308
  TS_EVENT_CACHE_OPEN_READ_FAILED       = 1103,
309
  TS_EVENT_CACHE_OPEN_WRITE             = 1108,
310
  TS_EVENT_CACHE_OPEN_WRITE_FAILED      = 1109,
311
  TS_EVENT_CACHE_REMOVE                 = 1112,
312
  TS_EVENT_CACHE_REMOVE_FAILED          = 1113,
313
  TS_EVENT_CACHE_SCAN                   = 1120,
314
  TS_EVENT_CACHE_SCAN_FAILED            = 1121,
315
  TS_EVENT_CACHE_SCAN_OBJECT            = 1122,
316
  TS_EVENT_CACHE_SCAN_OPERATION_BLOCKED = 1123,
317
  TS_EVENT_CACHE_SCAN_OPERATION_FAILED  = 1124,
318
  TS_EVENT_CACHE_SCAN_DONE              = 1125,
319
  TS_EVENT_CACHE_LOOKUP                 = 1126,
320
  TS_EVENT_CACHE_READ                   = 1127,
321
  TS_EVENT_CACHE_DELETE                 = 1128,
322
  TS_EVENT_CACHE_WRITE                  = 1129,
323
  TS_EVENT_CACHE_WRITE_HEADER           = 1130,
324
  TS_EVENT_CACHE_CLOSE                  = 1131,
325
  TS_EVENT_CACHE_LOOKUP_READY           = 1132,
326
  TS_EVENT_CACHE_LOOKUP_COMPLETE        = 1133,
327
  TS_EVENT_CACHE_READ_READY             = 1134,
328
  TS_EVENT_CACHE_READ_COMPLETE          = 1135,
329
330
  TS_EVENT_INTERNAL_1200 = 1200,
331
332
  TS_EVENT_SSL_SESSION_GET    = 2000,
333
  TS_EVENT_SSL_SESSION_NEW    = 2001,
334
  TS_EVENT_SSL_SESSION_REMOVE = 2002,
335
336
  TS_EVENT_AIO_DONE = 3900,
337
338
  TS_EVENT_HTTP_CONTINUE                     = 60000,
339
  TS_EVENT_HTTP_ERROR                        = 60001,
340
  TS_EVENT_HTTP_READ_REQUEST_HDR             = 60002,
341
  TS_EVENT_HTTP_OS_DNS                       = 60003,
342
  TS_EVENT_HTTP_SEND_REQUEST_HDR             = 60004,
343
  TS_EVENT_HTTP_READ_CACHE_HDR               = 60005,
344
  TS_EVENT_HTTP_READ_RESPONSE_HDR            = 60006,
345
  TS_EVENT_HTTP_SEND_RESPONSE_HDR            = 60007,
346
  TS_EVENT_HTTP_REQUEST_TRANSFORM            = 60008,
347
  TS_EVENT_HTTP_RESPONSE_TRANSFORM           = 60009,
348
  TS_EVENT_HTTP_SELECT_ALT                   = 60010,
349
  TS_EVENT_HTTP_TXN_START                    = 60011,
350
  TS_EVENT_HTTP_TXN_CLOSE                    = 60012,
351
  TS_EVENT_HTTP_SSN_START                    = 60013,
352
  TS_EVENT_HTTP_SSN_CLOSE                    = 60014,
353
  TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE        = 60015,
354
  TS_EVENT_HTTP_PRE_REMAP                    = 60016,
355
  TS_EVENT_HTTP_POST_REMAP                   = 60017,
356
  TS_EVENT_HTTP_REQUEST_BUFFER_READ_COMPLETE = 60018,
357
  TS_EVENT_HTTP_RESPONSE_CLIENT              = 60019,
358
  TS_EVENT_HTTP_REQUEST_CLIENT               = 60020,
359
  TS_EVENT_HTTP_TUNNEL_START                 = 60021,
360
361
  TS_EVENT_LIFECYCLE_PORTS_INITIALIZED          = 60100,
362
  TS_EVENT_LIFECYCLE_PORTS_READY                = 60101,
363
  TS_EVENT_LIFECYCLE_CACHE_READY                = 60102,
364
  TS_EVENT_LIFECYCLE_SERVER_SSL_CTX_INITIALIZED = 60103,
365
  TS_EVENT_LIFECYCLE_CLIENT_SSL_CTX_INITIALIZED = 60104,
366
  TS_EVENT_LIFECYCLE_MSG                        = 60105,
367
  TS_EVENT_LIFECYCLE_TASK_THREADS_READY         = 60106,
368
  TS_EVENT_LIFECYCLE_SHUTDOWN                   = 60107,
369
  TS_EVENT_LIFECYCLE_LOG_INITIALIZED            = 60108,
370
371
  TS_EVENT_INTERNAL_60200    = 60200,
372
  TS_EVENT_INTERNAL_60201    = 60201,
373
  TS_EVENT_INTERNAL_60202    = 60202,
374
  TS_EVENT_SSL_CERT          = 60203,
375
  TS_EVENT_SSL_SERVERNAME    = 60204,
376
  TS_EVENT_SSL_VERIFY_SERVER = 60205,
377
  TS_EVENT_SSL_VERIFY_CLIENT = 60206,
378
  TS_EVENT_SSL_CLIENT_HELLO  = 60207,
379
  TS_EVENT_SSL_SECRET        = 60208,
380
381
  TS_EVENT_MGMT_UPDATE = 60300,
382
};
383
TSEvent const TS_EVENT_HTTP_READ_REQUEST_PRE_REMAP = TS_EVENT_HTTP_PRE_REMAP; /* backwards compat */
384
385
/**
386
    This set of enums represents the possible hooks where you can
387
    set up continuation callbacks. The functions used to register a
388
    continuation for a particular hook are:
389
390
    TSHttpHookAdd: adds a global hook. You can globally add
391
    any hook except for
392
     - TS_HTTP_REQUEST_TRANSFORM_HOOK
393
     - TS_HTTP_RESPONSE_TRANSFORM_HOOK
394
     - TS_HTTP_RESPONSE_CLIENT_HOOK
395
     - TS_HTTP_REQUEST_CLIENT_HOOK
396
397
    The following hooks can ONLY be added globally:
398
     - TS_HTTP_SELECT_ALT_HOOK
399
     - TS_HTTP_SSN_START_HOOK
400
401
    TSHttpSsnHookAdd: adds a transaction hook to each transaction
402
    within a session. You can only use transaction hooks with this call:
403
     - TS_HTTP_READ_REQUEST_HDR_HOOK
404
     - TS_HTTP_OS_DNS_HOOK
405
     - TS_HTTP_SEND_REQUEST_HDR_HOOK
406
     - TS_HTTP_READ_CACHE_HDR_HOOK
407
     - TS_HTTP_READ_RESPONSE_HDR_HOOK
408
     - TS_HTTP_SEND_RESPONSE_HDR_HOOK
409
     - TS_HTTP_REQUEST_TRANSFORM_HOOK
410
     - TS_HTTP_RESPONSE_TRANSFORM_HOOK
411
     - TS_HTTP_RESPONSE_CLIENT_HOOK
412
     - TS_HTTP_REQUEST_CLIENT_HOOK
413
     - TS_HTTP_TXN_START_HOOK
414
     - TS_HTTP_TXN_CLOSE_HOOK
415
     - TS_HTTP_SSN_CLOSE_HOOK
416
417
    TSHttpTxnHookAdd: adds a callback at a specific point within
418
    an HTTP transaction. The following hooks can be used with this
419
    function:
420
     - TS_HTTP_READ_REQUEST_HDR_HOOK
421
     - TS_HTTP_OS_DNS_HOOK
422
     - TS_HTTP_SEND_REQUEST_HDR_HOOK
423
     - TS_HTTP_READ_CACHE_HDR_HOOK
424
     - TS_HTTP_READ_RESPONSE_HDR_HOOK
425
     - TS_HTTP_SEND_RESPONSE_HDR_HOOK
426
     - TS_HTTP_REQUEST_TRANSFORM_HOOK
427
     - TS_HTTP_RESPONSE_TRANSFORM_HOOK
428
     - TS_HTTP_TXN_CLOSE_HOOK
429
430
    The two transform hooks can ONLY be added as transaction hooks.
431
432
    TS_VCONN_START_HOOK - called just after the connection is created,
433
    before other activity such as I/O or TLS handshakes  No handshake
434
    data has been read or sent (from the proxy) at this point
435
436
    TS_HTTP_LAST_HOOK _must_ be the last element. Only right place
437
    to insert a new element is just before TS_HTTP_LAST_HOOK.
438
439
440
    @note The TS_HTTP hooks below have to be in the same order as their
441
    corresponding TS_EVENT counterparts.  We use this in calculating the
442
    corresponding event from a hook ID by summing
443
    TS_EVENT_HTTP_READ_REQUEST_HDR with the hook ID (see the invoke call in
444
    HttpSM::state_api_callout). For example, the following expression must be
445
    true:
446
447
    TS_EVENT_HTTP_TXN_CLOSE == TS_EVENT_HTTP_READ_REQUEST_HDR + TS_HTTP_TXN_CLOSE_HOOK
448
449
 */
450
enum TSHttpHookID {
451
/*
452
   The following macro helps maintain the relationship between the TS_HTTP
453
   hooks and their TS_EVENT_HTTP counterparts as described in the above
454
   doxygen comment.
455
 */
456
#define DERIVE_HOOK_VALUE_FROM_EVENT(COMMON) TS_HTTP_##COMMON##_HOOK = TS_EVENT_HTTP_##COMMON - TS_EVENT_HTTP_READ_REQUEST_HDR
457
  DERIVE_HOOK_VALUE_FROM_EVENT(READ_REQUEST_HDR),             // TS_HTTP_READ_REQUEST_HDR_HOOK
458
  DERIVE_HOOK_VALUE_FROM_EVENT(OS_DNS),                       // TS_HTTP_OS_DNS_HOOK
459
  DERIVE_HOOK_VALUE_FROM_EVENT(SEND_REQUEST_HDR),             // TS_HTTP_SEND_REQUEST_HDR_HOOK
460
  DERIVE_HOOK_VALUE_FROM_EVENT(READ_CACHE_HDR),               // TS_HTTP_READ_CACHE_HDR_HOOK
461
  DERIVE_HOOK_VALUE_FROM_EVENT(READ_RESPONSE_HDR),            // TS_HTTP_READ_RESPONSE_HDR_HOOK
462
  DERIVE_HOOK_VALUE_FROM_EVENT(SEND_RESPONSE_HDR),            // TS_HTTP_SEND_RESPONSE_HDR_HOOK
463
  DERIVE_HOOK_VALUE_FROM_EVENT(REQUEST_TRANSFORM),            // TS_HTTP_REQUEST_TRANSFORM_HOOK
464
  DERIVE_HOOK_VALUE_FROM_EVENT(RESPONSE_TRANSFORM),           // TS_HTTP_RESPONSE_TRANSFORM_HOOK
465
  DERIVE_HOOK_VALUE_FROM_EVENT(SELECT_ALT),                   // TS_HTTP_SELECT_ALT_HOOK
466
  DERIVE_HOOK_VALUE_FROM_EVENT(TXN_START),                    // TS_HTTP_TXN_START_HOOK
467
  DERIVE_HOOK_VALUE_FROM_EVENT(TXN_CLOSE),                    // TS_HTTP_TXN_CLOSE_HOOK
468
  DERIVE_HOOK_VALUE_FROM_EVENT(SSN_START),                    // TS_HTTP_SSN_START_HOOK
469
  DERIVE_HOOK_VALUE_FROM_EVENT(SSN_CLOSE),                    // TS_HTTP_SSN_CLOSE_HOOK
470
  DERIVE_HOOK_VALUE_FROM_EVENT(CACHE_LOOKUP_COMPLETE),        // TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK
471
  DERIVE_HOOK_VALUE_FROM_EVENT(PRE_REMAP),                    // TS_HTTP_PRE_REMAP_HOOK
472
  DERIVE_HOOK_VALUE_FROM_EVENT(POST_REMAP),                   // TS_HTTP_POST_REMAP_HOOK
473
  DERIVE_HOOK_VALUE_FROM_EVENT(REQUEST_BUFFER_READ_COMPLETE), // TS_HTTP_REQUEST_BUFFER_READ_COMPLETE_HOOK
474
  DERIVE_HOOK_VALUE_FROM_EVENT(RESPONSE_CLIENT),              // TS_HTTP_RESPONSE_CLIENT_HOOK
475
  DERIVE_HOOK_VALUE_FROM_EVENT(REQUEST_CLIENT),               // TS_HTTP_REQUEST_CLIENT_HOOK
476
  DERIVE_HOOK_VALUE_FROM_EVENT(TUNNEL_START),                 // TS_HTTP_TUNNEL_START_HOOK
477
478
// NOTE:
479
// If adding any TS_HTTP hooks, be sure to understand the note above in the
480
// doxygen comment about the ordering of these enum values with respect to
481
// their corresponding TS_EVENT values.
482
#undef DERIVE_HOOK_VALUE_FROM_EVENT
483
484
  // Putting the SSL hooks in the same enum space
485
  // So both sets of hooks can be set by the same Hook function
486
  TS_SSL_FIRST_HOOK,
487
  TS_VCONN_START_HOOK      = TS_SSL_FIRST_HOOK,
488
  TS_VCONN_PRE_ACCEPT_HOOK = TS_VCONN_START_HOOK, // Deprecated but compatible for now.
489
  TS_VCONN_CLOSE_HOOK,
490
  TS_SSL_CLIENT_HELLO_HOOK,
491
  TS_SSL_SNI_HOOK,
492
  TS_SSL_CERT_HOOK = TS_SSL_SNI_HOOK,
493
  TS_SSL_SERVERNAME_HOOK,
494
  TS_SSL_SERVER_VERIFY_HOOK,
495
  TS_SSL_VERIFY_SERVER_HOOK = TS_SSL_SERVER_VERIFY_HOOK,
496
  TS_SSL_VERIFY_CLIENT_HOOK,
497
  TS_SSL_SESSION_HOOK,
498
  TS_VCONN_OUTBOUND_START_HOOK,
499
  TS_VCONN_OUTBOUND_CLOSE_HOOK,
500
  TS_SSL_LAST_HOOK = TS_VCONN_OUTBOUND_CLOSE_HOOK,
501
  TS_HTTP_LAST_HOOK,
502
};
503
504
/** Plugin lifecycle hooks.
505
506
    These are called during lifecycle events of a plugin. They
507
    should be set in the plugin initialization function. The
508
    continuation is invoked with an event ID specified for each hook
509
    and @c nullptr for the event data.
510
511
    TS_LIFECYCLE_PORTS_INITIALIZED_HOOK
512
513
      called once, after the HTTP proxy port data structures have
514
      been initialized. In particular, SSL related calls that depend
515
      on accept endpoints may be invoked. After this hook is
516
      finished, the proxy port sockets are opened and connections
517
      are accepted.
518
519
      Event: TS_EVENT_LIFECYCLE_PORTS_INITIALIZED
520
521
    TS_LIFECYCLE_PORTS_READY_HOOK
522
523
      called once, after the sockets have been opened and the accept
524
      threads have been started. That is, the ports are ready to
525
      accept connections. This is *not* guaranteed to be called
526
      before the first connection is accepted.
527
528
      Event: TS_EVENT_LIFECYCLE_PORTS_READY
529
530
    TS_LIFECYCLE_CACHE_READY_HOOK
531
532
      called once, after the cache has finished its
533
      initialization. It is either online or has failed when this
534
      hook is called.
535
536
      Event: TS_EVENT_LIFECYCLE_CACHE_READY
537
538
    TS_LIFECYCLE_SERVER_SSL_CTX_INITIALIZED_HOOK
539
540
      called every time after a server SSL_CTX has finished the initialization.
541
      It exposes the initialized SSL_CTX pointer.
542
543
      Event: TS_EVENT_LIFECYCLE_SERVER_SSL_CTX_INITIALIZED
544
545
    TS_LIFECYCLE_CLIENT_SSL_CTX_INITIALIZED_HOOK
546
547
      called once, after the client SSL_CTX has finished the initialization.
548
      It exposes the initialized SSL_CTX pointer.
549
550
      Event: TS_EVENT_LIFECYCLE_CLIENT_SSL_CTX_INITIALIZED
551
552
    TS_LIFECYCLE_MSG_HOOK
553
554
      Called in response to an external agent. The data is a pointer to  an instance of TSPluginMsg.
555
556
      Event: TS_EVENT_LIFECYCLE_MSG
557
558
    TS_LIFECYCLE_TASK_THREADS_READY_HOOK
559
560
      called once, after the task threads have been started.
561
562
      Event: TS_EVENT_LIFECYCLE_TASK_THREADS_READY
563
564
    TS_LIFECYCLE_SHUTDOWN_HOOK
565
566
      called once, after receiving a shutdown signal, such as SIGTERM.
567
568
      Event: TS_EVENT_LIFECYCLE_SHUTDOWN
569
570
    Ordering guarantees:
571
572
    - TS_LIFECYCLE_PORTS_INITIALIZED_HOOK before TS_LIFECYCLE_PORTS_READY_HOOK.
573
574
    NOTE! ONLY the orderings EXPLICITLY mentioned above are guaranteed.
575
576
 */
577
enum TSLifecycleHookID {
578
  TS_LIFECYCLE_PORTS_INITIALIZED_HOOK,
579
  TS_LIFECYCLE_PORTS_READY_HOOK,
580
  TS_LIFECYCLE_CACHE_READY_HOOK,
581
  TS_LIFECYCLE_SERVER_SSL_CTX_INITIALIZED_HOOK,
582
  TS_LIFECYCLE_CLIENT_SSL_CTX_INITIALIZED_HOOK,
583
  TS_LIFECYCLE_MSG_HOOK,
584
  TS_LIFECYCLE_TASK_THREADS_READY_HOOK,
585
  TS_LIFECYCLE_SHUTDOWN_HOOK,
586
  TS_LIFECYCLE_SSL_SECRET_HOOK,
587
  TS_LIFECYCLE_LOG_INITIALIZED_HOOK,
588
  TS_LIFECYCLE_LAST_HOOK,
589
};
590
591
enum TSServerState {
592
  TS_SRVSTATE_STATE_UNDEFINED = 0,
593
  TS_SRVSTATE_ACTIVE_TIMEOUT,
594
  TS_SRVSTATE_BAD_INCOMING_RESPONSE,
595
  TS_SRVSTATE_CONNECTION_ALIVE,
596
  TS_SRVSTATE_CONNECTION_CLOSED,
597
  TS_SRVSTATE_CONNECTION_ERROR,
598
  TS_SRVSTATE_INACTIVE_TIMEOUT,
599
  TS_SRVSTATE_OPEN_RAW_ERROR,
600
  TS_SRVSTATE_PARSE_ERROR,
601
  TS_SRVSTATE_TRANSACTION_COMPLETE,
602
  TS_SRVSTATE_PARENT_RETRY,
603
  TS_SRVSTATE_OUTBOUND_CONGESTION,
604
};
605
606
enum TSLookingUpType {
607
  TS_LOOKUP_UNDEFINED_LOOKUP,
608
  TS_LOOKUP_PARENT_PROXY,
609
  TS_LOOKUP_ORIGIN_SERVER,
610
  TS_LOOKUP_INCOMING_ROUTER,
611
  TS_LOOKUP_HOST_NONE,
612
};
613
614
enum TSCacheLookupResult {
615
  TS_CACHE_LOOKUP_MISS,
616
  TS_CACHE_LOOKUP_HIT_STALE,
617
  TS_CACHE_LOOKUP_HIT_FRESH,
618
  TS_CACHE_LOOKUP_SKIPPED,
619
};
620
621
enum TSCacheDataType {
622
  TS_CACHE_DATA_TYPE_NONE,
623
  TS_CACHE_DATA_TYPE_HTTP,
624
  TS_CACHE_DATA_TYPE_OTHER,
625
};
626
627
enum TSCacheError {
628
  TS_CACHE_ERROR_NO_DOC    = -20400,
629
  TS_CACHE_ERROR_DOC_BUSY  = -20401,
630
  TS_CACHE_ERROR_NOT_READY = -20407,
631
};
632
633
enum TSCacheScanResult {
634
  TS_CACHE_SCAN_RESULT_DONE     = 0,
635
  TS_CACHE_SCAN_RESULT_CONTINUE = 1,
636
  TS_CACHE_SCAN_RESULT_DELETE   = 10,
637
  TS_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES,
638
  TS_CACHE_SCAN_RESULT_UPDATE,
639
  TS_CACHE_SCAN_RESULT_RETRY,
640
};
641
642
enum TSHttpTxnInfoKey {
643
  TS_TXN_INFO_NONE = -1,
644
  TS_TXN_INFO_CACHE_HIT_RAM,
645
  TS_TXN_INFO_CACHE_COMPRESSED_IN_RAM,
646
  TS_TXN_INFO_CACHE_HIT_RWW, // READ_WHILE_WRITE
647
  TS_TXN_INFO_CACHE_OPEN_READ_TRIES,
648
  TS_TXN_INFO_CACHE_OPEN_WRITE_TRIES,
649
  TS_TXN_INFO_CACHE_VOLUME,
650
  TS_TXN_INFO_LAST_ENTRY,
651
};
652
653
enum TSHttpSsnInfoKey {
654
  TS_SSN_INFO_NONE = -1,
655
  TS_SSN_INFO_TRANSACTION_COUNT,
656
  TS_SSN_INFO_RECEIVED_FRAME_COUNT,
657
};
658
659
enum TSVConnPPInfoKey {
660
  TS_PP_INFO_VERSION = 0x100,
661
  TS_PP_INFO_SRC_ADDR,
662
  TS_PP_INFO_SRC_PORT,
663
  TS_PP_INFO_DST_ADDR,
664
  TS_PP_INFO_DST_PORT,
665
  TS_PP_INFO_PROTOCOL,
666
  TS_PP_INFO_SOCK_TYPE,
667
};
668
669
#define TS_SSN_INFO_RECEIVED_FRAME_COUNT_H2_UNKNOWN 999
670
#define TS_SSN_INFO_RECEIVED_FRAME_COUNT_H3_UNKNOWN 0x21
671
672
enum TSVConnCloseFlags {
673
  TS_VC_CLOSE_ABORT  = -1,
674
  TS_VC_CLOSE_NORMAL = 1,
675
};
676
677
enum TSIOBufferSizeIndex {
678
  TS_IOBUFFER_SIZE_INDEX_128  = 0,
679
  TS_IOBUFFER_SIZE_INDEX_256  = 1,
680
  TS_IOBUFFER_SIZE_INDEX_512  = 2,
681
  TS_IOBUFFER_SIZE_INDEX_1K   = 3,
682
  TS_IOBUFFER_SIZE_INDEX_2K   = 4,
683
  TS_IOBUFFER_SIZE_INDEX_4K   = 5,
684
  TS_IOBUFFER_SIZE_INDEX_8K   = 6,
685
  TS_IOBUFFER_SIZE_INDEX_16K  = 7,
686
  TS_IOBUFFER_SIZE_INDEX_32K  = 8,
687
  TS_IOBUFFER_SIZE_INDEX_64K  = 9,
688
  TS_IOBUFFER_SIZE_INDEX_128K = 10,
689
  TS_IOBUFFER_SIZE_INDEX_256K = 11,
690
  TS_IOBUFFER_SIZE_INDEX_512K = 12,
691
  TS_IOBUFFER_SIZE_INDEX_1M   = 13,
692
  TS_IOBUFFER_SIZE_INDEX_2M   = 14,
693
};
694
695
enum TSIOBufferWaterMark {
696
  TS_IOBUFFER_WATER_MARK_UNDEFINED         = -1,
697
  TS_IOBUFFER_WATER_MARK_PLUGIN_VC_DEFAULT = 0,     // mirror of DEFAULT_PLUGIN_VC_BUFFER_WATER_MARK
698
  TS_IOBUFFER_WATER_MARK_HTTP_DEFAULT      = 32768, // mirror of default_buffer_water_mark
699
};
700
701
enum TSReturnCode {
702
  TS_ERROR   = -1,
703
  TS_SUCCESS = 0,
704
};
705
706
enum TSFetchWakeUpOptions {
707
  NO_CALLBACK = 0,
708
  AFTER_HEADER,
709
  AFTER_BODY,
710
};
711
712
/// Values for per server outbound connection tracking group definition.
713
/// See proxy.config.http.per_server.match
714
enum TSOutboundConnectionMatchType {
715
  TS_SERVER_OUTBOUND_MATCH_IP,
716
  TS_SERVER_OUTBOUND_MATCH_PORT,
717
  TS_SERVER_OUTBOUND_MATCH_HOST,
718
  TS_SERVER_OUTBOUND_MATCH_BOTH,
719
};
720
721
/* librecords types */
722
723
/* The values of this enum must match enum RecT in I_RecDefs.h */
724
enum TSRecordType {
725
  TS_RECORDTYPE_NULL    = 0x00,
726
  TS_RECORDTYPE_CONFIG  = 0x01,
727
  TS_RECORDTYPE_PROCESS = 0x02,
728
  TS_RECORDTYPE_NODE    = 0x04,
729
  TS_RECORDTYPE_PLUGIN  = 0x20,
730
  TS_RECORDTYPE_ALL     = 0x3F,
731
};
732
733
/* The values of this enum must match enum RecDataT in I_RecDefs.h */
734
enum TSRecordDataType {
735
  TS_RECORDDATATYPE_NULL = 0,
736
  TS_RECORDDATATYPE_INT,
737
  TS_RECORDDATATYPE_FLOAT,
738
  TS_RECORDDATATYPE_STRING,
739
  TS_RECORDDATATYPE_COUNTER,
740
  TS_RECORDDATATYPE_STAT_CONST,
741
  TS_RECORDDATATYPE_STAT_FX,
742
  TS_RECORDDATATYPE_MAX,
743
};
744
745
union TSRecordData {
746
  int64_t rec_int;
747
  float   rec_float;
748
  char   *rec_string;
749
  int64_t rec_counter;
750
};
751
752
/* The values of this enum must match enum RecPersistT in I_RecDefs.h */
753
enum TSRecordPersistType {
754
  TS_RECORDP_NULL,
755
  TS_RECORDP_PERSISTENT,
756
  TS_RECORDP_NON_PERSISTENT,
757
};
758
759
/* The values of this enum must match enum RecUpdateT in I_RecDefs.h */
760
enum TSRecordUpdateType {
761
  TS_RECORDUPDATE_NULL,
762
  TS_RECORDUPDATE_DYNAMIC,
763
  TS_RECORDUPDATE_RESTART_TS,
764
};
765
766
/* The values of this enum must match enum RecCheckT in I_RecDefs.h */
767
enum TSRecordCheckType {
768
  TS_RECORDCHECK_NULL,
769
  TS_RECORDCHECK_STR,
770
  TS_RECORDCHECK_INT,
771
  TS_RECORDCHECK_IP,
772
};
773
774
/* The values of this enum must match enum RecAccessT in I_RecDefs.h */
775
enum TSRecordAccessType {
776
  TS_RECORDACCESS_NULL,
777
  TS_RECORDACCESS_NO_ACCESS,
778
  TS_RECORDACCESS_READ_ONLY,
779
};
780
781
enum TSOverridableConfigKey {
782
  TS_CONFIG_NULL = -1,
783
  TS_CONFIG_URL_REMAP_PRISTINE_HOST_HDR,
784
  TS_CONFIG_HTTP_CHUNKING_ENABLED,
785
  TS_CONFIG_HTTP_NEGATIVE_CACHING_ENABLED,
786
  TS_CONFIG_HTTP_NEGATIVE_CACHING_LIFETIME,
787
  TS_CONFIG_HTTP_CACHE_WHEN_TO_REVALIDATE,
788
  TS_CONFIG_HTTP_KEEP_ALIVE_ENABLED_IN,
789
  TS_CONFIG_HTTP_KEEP_ALIVE_ENABLED_OUT,
790
  TS_CONFIG_HTTP_KEEP_ALIVE_POST_OUT,
791
  TS_CONFIG_HTTP_SERVER_SESSION_SHARING_MATCH,
792
  TS_CONFIG_NET_SOCK_RECV_BUFFER_SIZE_OUT,
793
  TS_CONFIG_NET_SOCK_SEND_BUFFER_SIZE_OUT,
794
  TS_CONFIG_NET_SOCK_OPTION_FLAG_OUT,
795
  TS_CONFIG_HTTP_FORWARD_PROXY_AUTH_TO_PARENT,
796
  TS_CONFIG_HTTP_ANONYMIZE_REMOVE_FROM,
797
  TS_CONFIG_HTTP_ANONYMIZE_REMOVE_REFERER,
798
  TS_CONFIG_HTTP_ANONYMIZE_REMOVE_USER_AGENT,
799
  TS_CONFIG_HTTP_ANONYMIZE_REMOVE_COOKIE,
800
  TS_CONFIG_HTTP_ANONYMIZE_REMOVE_CLIENT_IP,
801
  TS_CONFIG_HTTP_ANONYMIZE_INSERT_CLIENT_IP,
802
  TS_CONFIG_HTTP_RESPONSE_SERVER_ENABLED,
803
  TS_CONFIG_HTTP_INSERT_SQUID_X_FORWARDED_FOR,
804
  TS_CONFIG_HTTP_SEND_HTTP11_REQUESTS,
805
  TS_CONFIG_HTTP_CACHE_HTTP,
806
  TS_CONFIG_HTTP_CACHE_IGNORE_CLIENT_NO_CACHE,
807
  TS_CONFIG_HTTP_CACHE_IGNORE_CLIENT_CC_MAX_AGE,
808
  TS_CONFIG_HTTP_CACHE_IMS_ON_CLIENT_NO_CACHE,
809
  TS_CONFIG_HTTP_CACHE_IGNORE_SERVER_NO_CACHE,
810
  TS_CONFIG_HTTP_CACHE_CACHE_RESPONSES_TO_COOKIES,
811
  TS_CONFIG_HTTP_CACHE_IGNORE_AUTHENTICATION,
812
  TS_CONFIG_HTTP_CACHE_CACHE_URLS_THAT_LOOK_DYNAMIC,
813
  TS_CONFIG_HTTP_CACHE_REQUIRED_HEADERS,
814
  TS_CONFIG_HTTP_INSERT_REQUEST_VIA_STR,
815
  TS_CONFIG_HTTP_INSERT_RESPONSE_VIA_STR,
816
  TS_CONFIG_HTTP_CACHE_HEURISTIC_MIN_LIFETIME,
817
  TS_CONFIG_HTTP_CACHE_HEURISTIC_MAX_LIFETIME,
818
  TS_CONFIG_HTTP_CACHE_GUARANTEED_MIN_LIFETIME,
819
  TS_CONFIG_HTTP_CACHE_GUARANTEED_MAX_LIFETIME,
820
  TS_CONFIG_HTTP_CACHE_MAX_STALE_AGE,
821
  TS_CONFIG_HTTP_KEEP_ALIVE_NO_ACTIVITY_TIMEOUT_IN,
822
  TS_CONFIG_HTTP_KEEP_ALIVE_NO_ACTIVITY_TIMEOUT_OUT,
823
  TS_CONFIG_HTTP_TRANSACTION_NO_ACTIVITY_TIMEOUT_IN,
824
  TS_CONFIG_HTTP_TRANSACTION_NO_ACTIVITY_TIMEOUT_OUT,
825
  TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_OUT,
826
  TS_CONFIG_HTTP_CONNECT_ATTEMPTS_MAX_RETRIES,
827
  TS_CONFIG_HTTP_CONNECT_ATTEMPTS_MAX_RETRIES_DOWN_SERVER,
828
  TS_CONFIG_HTTP_CONNECT_ATTEMPTS_RR_RETRIES,
829
  TS_CONFIG_HTTP_CONNECT_ATTEMPTS_TIMEOUT,
830
  TS_CONFIG_HTTP_DOWN_SERVER_CACHE_TIME,
831
  TS_CONFIG_HTTP_DOC_IN_CACHE_SKIP_DNS,
832
  TS_CONFIG_HTTP_BACKGROUND_FILL_ACTIVE_TIMEOUT,
833
  TS_CONFIG_HTTP_RESPONSE_SERVER_STR,
834
  TS_CONFIG_HTTP_CACHE_HEURISTIC_LM_FACTOR,
835
  TS_CONFIG_HTTP_BACKGROUND_FILL_COMPLETED_THRESHOLD,
836
  TS_CONFIG_NET_SOCK_PACKET_MARK_OUT,
837
  TS_CONFIG_NET_SOCK_PACKET_TOS_OUT,
838
  TS_CONFIG_HTTP_INSERT_AGE_IN_RESPONSE,
839
  TS_CONFIG_HTTP_CHUNKING_SIZE,
840
  TS_CONFIG_HTTP_FLOW_CONTROL_ENABLED,
841
  TS_CONFIG_HTTP_FLOW_CONTROL_LOW_WATER_MARK,
842
  TS_CONFIG_HTTP_FLOW_CONTROL_HIGH_WATER_MARK,
843
  TS_CONFIG_HTTP_CACHE_RANGE_LOOKUP,
844
  TS_CONFIG_HTTP_DEFAULT_BUFFER_SIZE,
845
  TS_CONFIG_HTTP_DEFAULT_BUFFER_WATER_MARK,
846
  TS_CONFIG_HTTP_REQUEST_HEADER_MAX_SIZE,
847
  TS_CONFIG_HTTP_RESPONSE_HEADER_MAX_SIZE,
848
  TS_CONFIG_HTTP_NEGATIVE_REVALIDATING_ENABLED,
849
  TS_CONFIG_HTTP_NEGATIVE_REVALIDATING_LIFETIME,
850
  TS_CONFIG_SSL_HSTS_MAX_AGE,
851
  TS_CONFIG_SSL_HSTS_INCLUDE_SUBDOMAINS,
852
  TS_CONFIG_HTTP_CACHE_OPEN_READ_RETRY_TIME,
853
  TS_CONFIG_HTTP_CACHE_MAX_OPEN_READ_RETRIES,
854
  TS_CONFIG_HTTP_CACHE_RANGE_WRITE,
855
  TS_CONFIG_HTTP_POST_CHECK_CONTENT_LENGTH_ENABLED,
856
  TS_CONFIG_HTTP_GLOBAL_USER_AGENT_HEADER,
857
  TS_CONFIG_HTTP_AUTH_SERVER_SESSION_PRIVATE,
858
  TS_CONFIG_HTTP_SLOW_LOG_THRESHOLD,
859
  TS_CONFIG_HTTP_CACHE_GENERATION,
860
  TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE,
861
  TS_CONFIG_HTTP_CACHE_OPEN_WRITE_FAIL_ACTION,
862
  TS_CONFIG_HTTP_NUMBER_OF_REDIRECTIONS,
863
  TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES,
864
  TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRY_TIMEOUT,
865
  TS_CONFIG_HTTP_REDIRECT_USE_ORIG_CACHE_KEY,
866
  TS_CONFIG_HTTP_ATTACH_SERVER_SESSION_TO_CLIENT,
867
  TS_CONFIG_WEBSOCKET_NO_ACTIVITY_TIMEOUT,
868
  TS_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT,
869
  TS_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT,
870
  TS_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS,
871
  TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN,
872
  TS_CONFIG_SRV_ENABLED,
873
  TS_CONFIG_HTTP_FORWARD_CONNECT_METHOD,
874
  TS_CONFIG_SSL_CERT_FILENAME,
875
  TS_CONFIG_SSL_CLIENT_CERT_FILENAME = TS_CONFIG_SSL_CERT_FILENAME,
876
  TS_CONFIG_SSL_CERT_FILEPATH,
877
  TS_CONFIG_PARENT_FAILURES_UPDATE_HOSTDB,
878
  TS_CONFIG_HTTP_CACHE_IGNORE_ACCEPT_MISMATCH,
879
  TS_CONFIG_HTTP_CACHE_IGNORE_ACCEPT_LANGUAGE_MISMATCH,
880
  TS_CONFIG_HTTP_CACHE_IGNORE_ACCEPT_ENCODING_MISMATCH,
881
  TS_CONFIG_HTTP_CACHE_IGNORE_ACCEPT_CHARSET_MISMATCH,
882
  TS_CONFIG_HTTP_PARENT_PROXY_FAIL_THRESHOLD,
883
  TS_CONFIG_HTTP_PARENT_PROXY_RETRY_TIME,
884
  TS_CONFIG_HTTP_PER_PARENT_CONNECT_ATTEMPTS,
885
  TS_CONFIG_HTTP_NORMALIZE_AE,
886
  TS_CONFIG_HTTP_INSERT_FORWARDED,
887
  TS_CONFIG_HTTP_PROXY_PROTOCOL_OUT,
888
  TS_CONFIG_HTTP_ALLOW_MULTI_RANGE,
889
  TS_CONFIG_HTTP_REQUEST_BUFFER_ENABLED,
890
  TS_CONFIG_HTTP_ALLOW_HALF_OPEN,
891
  TS_CONFIG_HTTP_SERVER_MIN_KEEP_ALIVE_CONNS,
892
  TS_CONFIG_HTTP_PER_SERVER_CONNECTION_MAX,
893
  TS_CONFIG_HTTP_PER_SERVER_CONNECTION_MATCH,
894
  TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY,
895
  TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES,
896
  TS_CONFIG_SSL_CLIENT_SNI_POLICY,
897
  TS_CONFIG_SSL_CLIENT_PRIVATE_KEY_FILENAME,
898
  TS_CONFIG_SSL_CLIENT_CA_CERT_FILENAME,
899
  TS_CONFIG_SSL_CLIENT_ALPN_PROTOCOLS,
900
  TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE,
901
  TS_CONFIG_HTTP_CONNECT_DOWN_POLICY,
902
  TS_CONFIG_HTTP_MAX_PROXY_CYCLES,
903
  TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX,
904
  TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK,
905
  TS_CONFIG_NET_SOCK_NOTSENT_LOWAT,
906
  TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE,
907
  TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS,
908
  TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS,
909
  TS_CONFIG_NET_DEFAULT_INACTIVITY_TIMEOUT,
910
  TS_CONFIG_HTTP_NO_DNS_JUST_FORWARD_TO_PARENT,
911
  TS_CONFIG_HTTP_CACHE_IGNORE_QUERY,
912
  TS_CONFIG_HTTP_DROP_CHUNKED_TRAILERS,
913
  TS_CONFIG_HTTP_STRICT_CHUNK_PARSING,
914
  TS_CONFIG_HTTP_NEGATIVE_CACHING_LIST,
915
  TS_CONFIG_HTTP_CONNECT_ATTEMPTS_RETRY_BACKOFF_BASE,
916
  TS_CONFIG_HTTP_NEGATIVE_REVALIDATING_LIST,
917
  TS_CONFIG_HTTP_CACHE_POST_METHOD,
918
  TS_CONFIG_HTTP_CACHE_TARGETED_CACHE_CONTROL_HEADERS,
919
  TS_CONFIG_LAST_ENTRY,
920
};
921
922
/* The TASK pool of threads is the primary method of off-loading continuations from the
923
   net-threads. Configure this with proxy.config.task_threads in records.yaml. */
924
enum TSThreadPool {
925
  TS_THREAD_POOL_NET,
926
  TS_THREAD_POOL_TASK,
927
  /* unlikely you should use these */
928
  TS_THREAD_POOL_DNS,
929
  TS_THREAD_POOL_UDP,
930
};
931
932
/* TSHRTime stuff, this is a candidate for deprecation in v10.0.0 */
933
using TSHRTime = int64_t;
934
935
TSHRTime const TS_HRTIME_NSECOND = 1;
936
TSHRTime const TS_HRTIME_USECOND = 1000 * TS_HRTIME_NSECOND;
937
TSHRTime const TS_HRTIME_MSECOND = 1000 * TS_HRTIME_USECOND;
938
TSHRTime const TS_HRTIME_SECOND  = 1000 * TS_HRTIME_MSECOND;
939
940
constexpr TSHRTime
941
TS_HRTIME_SECONDS(TSHRTime x)
942
0
{
943
0
  return x * TS_HRTIME_SECOND;
944
0
}
945
constexpr TSHRTime
946
TS_HRTIME_MSECONDS(TSHRTime x)
947
0
{
948
0
  return x * TS_HRTIME_MSECOND;
949
0
}
950
constexpr TSHRTime
951
TS_HRTIME_USECONDS(TSHRTime x)
952
0
{
953
0
  return x * TS_HRTIME_USECOND;
954
0
}
955
constexpr TSHRTime
956
TS_HRTIME_NSECONDS(TSHRTime x)
957
0
{
958
0
  return x * TS_HRTIME_NSECOND;
959
0
}
960
961
/* The TSMilestonesType is an enum defining all the various milestones ("timers") that
962
   we track for a request. */
963
enum TSMilestonesType {
964
  TS_MILESTONE_NULL = -1,
965
  TS_MILESTONE_UA_BEGIN,
966
  TS_MILESTONE_UA_FIRST_READ,
967
  TS_MILESTONE_UA_READ_HEADER_DONE,
968
  TS_MILESTONE_UA_BEGIN_WRITE,
969
  TS_MILESTONE_UA_CLOSE,
970
  TS_MILESTONE_SERVER_FIRST_CONNECT,
971
  TS_MILESTONE_SERVER_CONNECT,
972
  TS_MILESTONE_SERVER_CONNECT_END,
973
  TS_MILESTONE_SERVER_BEGIN_WRITE,
974
  TS_MILESTONE_SERVER_FIRST_READ,
975
  TS_MILESTONE_SERVER_READ_HEADER_DONE,
976
  TS_MILESTONE_SERVER_CLOSE,
977
  TS_MILESTONE_CACHE_OPEN_READ_BEGIN,
978
  TS_MILESTONE_CACHE_OPEN_READ_END,
979
  TS_MILESTONE_CACHE_OPEN_WRITE_BEGIN,
980
  TS_MILESTONE_CACHE_OPEN_WRITE_END,
981
  TS_MILESTONE_DNS_LOOKUP_BEGIN,
982
  TS_MILESTONE_DNS_LOOKUP_END,
983
  TS_MILESTONE_SM_START,
984
  TS_MILESTONE_SM_FINISH,
985
  TS_MILESTONE_PLUGIN_ACTIVE,
986
  TS_MILESTONE_PLUGIN_TOTAL,
987
  TS_MILESTONE_TLS_HANDSHAKE_START,
988
  TS_MILESTONE_TLS_HANDSHAKE_END,
989
  TS_MILESTONE_SERVER_TLS_HANDSHAKE_START,
990
  TS_MILESTONE_SERVER_TLS_HANDSHAKE_END,
991
  TS_MILESTONE_LAST_ENTRY,
992
};
993
994
/* These type aliases are used with the corresponding TSMgmt*Get functions
995
   for storing the values retrieved by those functions. For example,
996
   TSMgmtCounterGet() retrieves an TSMgmtCounter. */
997
using TSMgmtInt     = int64_t;
998
using TSMgmtCounter = int64_t;
999
using TSMgmtFloat   = float;
1000
using TSMgmtString  = char *;
1001
1002
/// The source of a management value.
1003
enum TSMgmtSource {
1004
  TS_MGMT_SOURCE_NULL,     ///< No source / value not found.
1005
  TS_MGMT_SOURCE_DEFAULT,  ///< Built in core default.
1006
  TS_MGMT_SOURCE_PLUGIN,   ///< Plugin supplied default.
1007
  TS_MGMT_SOURCE_EXPLICIT, ///< Set by administrator (config file, external API, etc.)
1008
  TS_MGMT_SOURCE_ENV,      ///< Process environment variable.
1009
};
1010
1011
/// The User Arg type, used for Txn/Ssn/VConn user argument slots
1012
enum TSUserArgType {
1013
  TS_USER_ARGS_TXN,   ///< Transaction based.
1014
  TS_USER_ARGS_SSN,   ///< Session based
1015
  TS_USER_ARGS_VCONN, ///< VConnection based
1016
  TS_USER_ARGS_GLB,   ///< Global based
1017
  TS_USER_ARGS_COUNT, ///< Fake enum, # of valid entries.
1018
};
1019
1020
/** An enumeration of HTTP version types for the priority functions that behave
1021
 * differently across HTTP protocols. */
1022
enum TSHttpPriorityType {
1023
  HTTP_PRIORITY_TYPE_HTTP_UNSPECIFIED = 1,
1024
  HTTP_PRIORITY_TYPE_HTTP_2,
1025
  HTTP_PRIORITY_TYPE_HTTP_3,
1026
};
1027
1028
/** The abstract type of the various HTTP priority implementations. */
1029
struct TSHttpPriority {
1030
  /** The reference to the concrete HTTP priority implementation. This will be
1031
   * a value from TSHttpPriorityType. */
1032
  uint8_t priority_type;
1033
  /** The space allocated for the concrete priority implementation.
1034
   *
1035
   * Note that this has to take padding into account. There is a static_assert
1036
   * in InkAPI.cc to verify that TSHttpPriority is at least as large as
1037
   * TSHttp2Priority. As other structures are added that are represented by
1038
   * TSHttpPriority add more static_asserts to verify that TSHttpPriority is as
1039
   * large as it needs to be.
1040
   */
1041
  uint8_t data[7];
1042
};
1043
1044
/** A structure for HTTP/2 priority.
1045
 *
1046
 * For an explanation of these terms with respect to HTTP/2, see RFC 7540,
1047
 * section 5.3.
1048
 */
1049
struct TSHttp2Priority {
1050
  uint8_t priority_type; /** HTTP_PROTOCOL_TYPE_HTTP_2 */
1051
  uint8_t weight;
1052
  /** The stream dependency. Per spec, see RFC 7540 section 6.2, this is 31
1053
   * bits. We use a signed 32 bit structure to store either a valid dependency
1054
   * or -1 if the stream has no dependency. */
1055
  int32_t stream_dependency;
1056
};
1057
1058
// Wrapper class that provides controlled access to client hello data
1059
class TSClientHello
1060
{
1061
public:
1062
  class TSExtensionTypeList
1063
  {
1064
  public:
1065
0
    TSExtensionTypeList(void *ch) : _ch(ch) {}
1066
1067
    class Iterator
1068
    {
1069
    public:
1070
      Iterator(const void *ite);
1071
      Iterator &operator++();
1072
      bool      operator==(const Iterator &b) const;
1073
      int       operator*() const;
1074
1075
    private:
1076
      char _real_iterator[24];
1077
    };
1078
1079
    Iterator begin();
1080
    Iterator end();
1081
1082
  private:
1083
    void *_ch;
1084
  };
1085
1086
0
  TSClientHello(void *ch) : _client_hello(ch) {}
1087
1088
  ~TSClientHello() = default;
1089
1090
  explicit
1091
  operator bool() const
1092
0
  {
1093
0
    return _client_hello != nullptr;
1094
0
  }
1095
1096
  bool is_available() const;
1097
1098
  uint16_t get_version() const;
1099
1100
  const uint8_t *get_cipher_suites() const;
1101
1102
  size_t get_cipher_suites_len() const;
1103
1104
  // Returns an iterable container of extension type IDs
1105
  // This abstracts the difference between BoringSSL (extensions buffer) and OpenSSL (extension_ids array)
1106
  TSExtensionTypeList
1107
  get_extension_types() const
1108
0
  {
1109
0
    return TSExtensionTypeList(_client_hello);
1110
0
  }
1111
1112
  // Internal accessor for API implementation
1113
  void *
1114
  _get_internal() const
1115
0
  {
1116
0
    return _client_hello;
1117
0
  }
1118
1119
private:
1120
  void *_client_hello;
1121
};
1122
static_assert(std::is_trivially_copyable_v<TSClientHello> == true);
1123
1124
using TSFile = struct tsapi_file *;
1125
1126
using TSMLoc          = struct tsapi_mloc *;
1127
using TSMBuffer       = struct tsapi_mbuffer *;
1128
using TSHttpSsn       = struct tsapi_httpssn *;
1129
using TSHttpTxn       = struct tsapi_httptxn *;
1130
using TSSslConnection = struct tsapi_ssl_obj *;
1131
using TSSslSession    = struct tsapi_ssl_session *;
1132
using TSHttpAltInfo   = struct tsapi_httpaltinfo *;
1133
using TSMimeParser    = struct tsapi_mimeparser *;
1134
using TSHttpParser    = struct tsapi_httpparser *;
1135
using TSCacheKey      = struct tsapi_cachekey *;
1136
using TSCacheHttpInfo = struct tsapi_cachehttpinfo *;
1137
using TSCacheTxn      = struct tsapi_cachetxn *;
1138
using TSSslVerifyCTX  = struct tsapi_x509_store_ctx *;
1139
1140
using TSPortDescriptor   = struct tsapi_port *;
1141
using TSVIO              = struct tsapi_vio *;
1142
using TSThread           = struct tsapi_thread *;
1143
using TSEventThread      = struct tsapi_event_thread *;
1144
using TSSslX509          = struct tsapi_x509 *;
1145
using TSMutex            = struct tsapi_mutex *;
1146
using TSConfig           = struct tsapi_config *;
1147
using TSCont             = struct tsapi_cont *;
1148
using TSVConn            = struct tsapi_cont *; /* a VConn is really a specialized TSCont */
1149
using TSSslContext       = struct tsapi_ssl_context *;
1150
using TSAction           = struct tsapi_action *;
1151
using TSIOBuffer         = struct tsapi_iobuffer *;
1152
using TSIOBufferData     = struct tsapi_iobufferdata *;
1153
using TSIOBufferBlock    = struct tsapi_bufferblock *;
1154
using TSIOBufferReader   = struct tsapi_bufferreader *;
1155
using TSHostLookupResult = struct tsapi_hostlookupresult *;
1156
using TSAIOCallback      = struct tsapi_aiocallback *;
1157
using TSAcceptor         = struct tsapi_net_accept *;
1158
using TSRemapPluginInfo  = struct tsapi_remap_plugin_info *;
1159
1160
using TSFetchSM = struct tsapi_fetchsm *;
1161
1162
using TSThreadFunc           = void *(*)(void *data);
1163
using TSEventFunc            = int (*)(TSCont contp, TSEvent event, void *edata);
1164
using TSConfigDestroyFunc    = void (*)(void *data);
1165
using TSLogMarshalCallback   = std::function<int(TSHttpTxn, char *)>;
1166
using TSLogUnmarshalCallback = std::tuple<int, int> (*)(char **, char *, int);
1167
1168
struct TSFetchEvent {
1169
  int success_event_id;
1170
  int failure_event_id;
1171
  int timeout_event_id;
1172
};
1173
1174
struct TSFetchUrlParams {
1175
  const char              *request;
1176
  int                      request_len;
1177
  int                      port;
1178
  struct sockaddr_storage  ip;
1179
  TSCont                   contp;
1180
  TSFetchEvent             events;
1181
  TSFetchWakeUpOptions     options;
1182
  struct TSFetchUrlParams *next;
1183
};
1184
using TSFetchUrlParams_t = TSFetchUrlParams;
1185
1186
// Extended FetchSM APIs
1187
enum TSFetchEventExt {
1188
  TS_FETCH_EVENT_EXT_HEAD_READY = -1,
1189
  TS_FETCH_EVENT_EXT_HEAD_DONE  = -2,
1190
  TS_FETCH_EVENT_EXT_BODY_READY = -3,
1191
  TS_FETCH_EVENT_EXT_BODY_DONE  = -4,
1192
};
1193
1194
enum TSFetchFlags {
1195
  TS_FETCH_FLAGS_NONE                 = 0,      // do nothing
1196
  TS_FETCH_FLAGS_STREAM               = 1 << 1, // enable stream IO
1197
  TS_FETCH_FLAGS_DECHUNK              = 1 << 2, // dechunk body content
1198
  TS_FETCH_FLAGS_NEWLOCK              = 1 << 3, // allocate new lock for fetch sm
1199
  TS_FETCH_FLAGS_NOT_INTERNAL_REQUEST = 1 << 4, // Allow this fetch to be created as a non-internal request.
1200
  TS_FETCH_FLAGS_SKIP_REMAP           = 1 << 5, // Skip remapping and allow requesting arbitary URL
1201
};
1202
1203
// This is a duplicate of the SSL_MAX_SSL_SESSION_ID_LENGTH constant
1204
// Redefining here so we don't include the openssl/ssl.h file here
1205
const int TS_SSL_MAX_SSL_SESSION_ID_LENGTH = 32;
1206
1207
// This mirrors the internal data structure SSLSessionID
1208
struct TSSslSessionID {
1209
  size_t len;
1210
  char   bytes[TS_SSL_MAX_SSL_SESSION_ID_LENGTH];
1211
};
1212
1213
struct TSSecretID {
1214
  const char *cert_name;
1215
  size_t      cert_name_len;
1216
  const char *key_name;
1217
  size_t      key_name_len;
1218
};
1219
1220
enum TSConnectType {
1221
  TS_CONNECT_UNDEFINED,
1222
  TS_CONNECT_PLUGIN,
1223
  TS_CONNECT_LAST_ENTRY,
1224
};
1225
1226
struct TSHttpConnectOptions {
1227
  TSConnectType          connect_type;
1228
  struct sockaddr const *addr;
1229
  const char            *tag;
1230
  int64_t                id;
1231
  TSIOBufferSizeIndex    buffer_index;
1232
  TSIOBufferWaterMark    buffer_water_mark;
1233
};
1234
1235
/* --------------------------------------------------------------------------
1236
   URL schemes */
1237
extern const char *TS_URL_SCHEME_FILE;
1238
extern const char *TS_URL_SCHEME_FTP;
1239
extern const char *TS_URL_SCHEME_GOPHER;
1240
extern const char *TS_URL_SCHEME_HTTP;
1241
extern const char *TS_URL_SCHEME_HTTPS;
1242
extern const char *TS_URL_SCHEME_MAILTO;
1243
extern const char *TS_URL_SCHEME_NEWS;
1244
extern const char *TS_URL_SCHEME_NNTP;
1245
extern const char *TS_URL_SCHEME_PROSPERO;
1246
extern const char *TS_URL_SCHEME_TELNET;
1247
extern const char *TS_URL_SCHEME_TUNNEL;
1248
extern const char *TS_URL_SCHEME_WAIS;
1249
extern const char *TS_URL_SCHEME_PNM;
1250
extern const char *TS_URL_SCHEME_RTSP;
1251
extern const char *TS_URL_SCHEME_RTSPU;
1252
extern const char *TS_URL_SCHEME_MMS;
1253
extern const char *TS_URL_SCHEME_MMSU;
1254
extern const char *TS_URL_SCHEME_MMST;
1255
extern const char *TS_URL_SCHEME_WS;
1256
extern const char *TS_URL_SCHEME_WSS;
1257
1258
/* --------------------------------------------------------------------------
1259
   URL scheme string lengths */
1260
extern int TS_URL_LEN_FILE;
1261
extern int TS_URL_LEN_FTP;
1262
extern int TS_URL_LEN_GOPHER;
1263
extern int TS_URL_LEN_HTTP;
1264
extern int TS_URL_LEN_HTTPS;
1265
extern int TS_URL_LEN_MAILTO;
1266
extern int TS_URL_LEN_NEWS;
1267
extern int TS_URL_LEN_NNTP;
1268
extern int TS_URL_LEN_PROSPERO;
1269
extern int TS_URL_LEN_TELNET;
1270
extern int TS_URL_LEN_WAIS;
1271
extern int TS_URL_LEN_WS;
1272
extern int TS_URL_LEN_WSS;
1273
1274
/* --------------------------------------------------------------------------
1275
   MIME fields */
1276
extern const char *TS_MIME_FIELD_ACCEPT;
1277
extern const char *TS_MIME_FIELD_ACCEPT_CHARSET;
1278
extern const char *TS_MIME_FIELD_ACCEPT_ENCODING;
1279
extern const char *TS_MIME_FIELD_ACCEPT_LANGUAGE;
1280
extern const char *TS_MIME_FIELD_ACCEPT_RANGES;
1281
extern const char *TS_MIME_FIELD_AGE;
1282
extern const char *TS_MIME_FIELD_ALLOW;
1283
extern const char *TS_MIME_FIELD_APPROVED;
1284
extern const char *TS_MIME_FIELD_AUTHORIZATION;
1285
extern const char *TS_MIME_FIELD_BYTES;
1286
extern const char *TS_MIME_FIELD_CACHE_CONTROL;
1287
extern const char *TS_MIME_FIELD_CLIENT_IP;
1288
extern const char *TS_MIME_FIELD_CONNECTION;
1289
extern const char *TS_MIME_FIELD_CONTENT_BASE;
1290
extern const char *TS_MIME_FIELD_CONTENT_ENCODING;
1291
extern const char *TS_MIME_FIELD_CONTENT_LANGUAGE;
1292
extern const char *TS_MIME_FIELD_CONTENT_LENGTH;
1293
extern const char *TS_MIME_FIELD_CONTENT_LOCATION;
1294
extern const char *TS_MIME_FIELD_CONTENT_MD5;
1295
extern const char *TS_MIME_FIELD_CONTENT_RANGE;
1296
extern const char *TS_MIME_FIELD_CONTENT_TYPE;
1297
extern const char *TS_MIME_FIELD_CONTROL;
1298
extern const char *TS_MIME_FIELD_COOKIE;
1299
extern const char *TS_MIME_FIELD_DATE;
1300
extern const char *TS_MIME_FIELD_DISTRIBUTION;
1301
extern const char *TS_MIME_FIELD_ETAG;
1302
extern const char *TS_MIME_FIELD_EXPECT;
1303
extern const char *TS_MIME_FIELD_EXPIRES;
1304
extern const char *TS_MIME_FIELD_FOLLOWUP_TO;
1305
extern const char *TS_MIME_FIELD_FROM;
1306
extern const char *TS_MIME_FIELD_HOST;
1307
extern const char *TS_MIME_FIELD_IF_MATCH;
1308
extern const char *TS_MIME_FIELD_IF_MODIFIED_SINCE;
1309
extern const char *TS_MIME_FIELD_IF_NONE_MATCH;
1310
extern const char *TS_MIME_FIELD_IF_RANGE;
1311
extern const char *TS_MIME_FIELD_IF_UNMODIFIED_SINCE;
1312
extern const char *TS_MIME_FIELD_KEEP_ALIVE;
1313
extern const char *TS_MIME_FIELD_KEYWORDS;
1314
extern const char *TS_MIME_FIELD_LAST_MODIFIED;
1315
extern const char *TS_MIME_FIELD_LINES;
1316
extern const char *TS_MIME_FIELD_LOCATION;
1317
extern const char *TS_MIME_FIELD_MAX_FORWARDS;
1318
extern const char *TS_MIME_FIELD_MESSAGE_ID;
1319
extern const char *TS_MIME_FIELD_NEWSGROUPS;
1320
extern const char *TS_MIME_FIELD_ORGANIZATION;
1321
extern const char *TS_MIME_FIELD_PATH;
1322
extern const char *TS_MIME_FIELD_PRAGMA;
1323
extern const char *TS_MIME_FIELD_PROXY_AUTHENTICATE;
1324
extern const char *TS_MIME_FIELD_PROXY_AUTHORIZATION;
1325
extern const char *TS_MIME_FIELD_PROXY_CONNECTION;
1326
extern const char *TS_MIME_FIELD_PUBLIC;
1327
extern const char *TS_MIME_FIELD_RANGE;
1328
extern const char *TS_MIME_FIELD_REFERENCES;
1329
extern const char *TS_MIME_FIELD_REFERER;
1330
extern const char *TS_MIME_FIELD_REPLY_TO;
1331
extern const char *TS_MIME_FIELD_RETRY_AFTER;
1332
extern const char *TS_MIME_FIELD_SENDER;
1333
extern const char *TS_MIME_FIELD_SERVER;
1334
extern const char *TS_MIME_FIELD_SET_COOKIE;
1335
extern const char *TS_MIME_FIELD_STRICT_TRANSPORT_SECURITY;
1336
extern const char *TS_MIME_FIELD_SUBJECT;
1337
extern const char *TS_MIME_FIELD_SUMMARY;
1338
extern const char *TS_MIME_FIELD_TE;
1339
extern const char *TS_MIME_FIELD_TRANSFER_ENCODING;
1340
extern const char *TS_MIME_FIELD_UPGRADE;
1341
extern const char *TS_MIME_FIELD_USER_AGENT;
1342
extern const char *TS_MIME_FIELD_VARY;
1343
extern const char *TS_MIME_FIELD_VIA;
1344
extern const char *TS_MIME_FIELD_WARNING;
1345
extern const char *TS_MIME_FIELD_WWW_AUTHENTICATE;
1346
extern const char *TS_MIME_FIELD_XREF;
1347
extern const char *TS_MIME_FIELD_X_FORWARDED_FOR;
1348
extern const char *TS_MIME_FIELD_FORWARDED;
1349
1350
/* --------------------------------------------------------------------------
1351
   MIME fields string lengths */
1352
extern int TS_MIME_LEN_ACCEPT;
1353
extern int TS_MIME_LEN_ACCEPT_CHARSET;
1354
extern int TS_MIME_LEN_ACCEPT_ENCODING;
1355
extern int TS_MIME_LEN_ACCEPT_LANGUAGE;
1356
extern int TS_MIME_LEN_ACCEPT_RANGES;
1357
extern int TS_MIME_LEN_AGE;
1358
extern int TS_MIME_LEN_ALLOW;
1359
extern int TS_MIME_LEN_APPROVED;
1360
extern int TS_MIME_LEN_AUTHORIZATION;
1361
extern int TS_MIME_LEN_BYTES;
1362
extern int TS_MIME_LEN_CACHE_CONTROL;
1363
extern int TS_MIME_LEN_CLIENT_IP;
1364
extern int TS_MIME_LEN_CONNECTION;
1365
extern int TS_MIME_LEN_CONTENT_BASE;
1366
extern int TS_MIME_LEN_CONTENT_ENCODING;
1367
extern int TS_MIME_LEN_CONTENT_LANGUAGE;
1368
extern int TS_MIME_LEN_CONTENT_LENGTH;
1369
extern int TS_MIME_LEN_CONTENT_LOCATION;
1370
extern int TS_MIME_LEN_CONTENT_MD5;
1371
extern int TS_MIME_LEN_CONTENT_RANGE;
1372
extern int TS_MIME_LEN_CONTENT_TYPE;
1373
extern int TS_MIME_LEN_CONTROL;
1374
extern int TS_MIME_LEN_COOKIE;
1375
extern int TS_MIME_LEN_DATE;
1376
extern int TS_MIME_LEN_DISTRIBUTION;
1377
extern int TS_MIME_LEN_ETAG;
1378
extern int TS_MIME_LEN_EXPECT;
1379
extern int TS_MIME_LEN_EXPIRES;
1380
extern int TS_MIME_LEN_FOLLOWUP_TO;
1381
extern int TS_MIME_LEN_FROM;
1382
extern int TS_MIME_LEN_HOST;
1383
extern int TS_MIME_LEN_IF_MATCH;
1384
extern int TS_MIME_LEN_IF_MODIFIED_SINCE;
1385
extern int TS_MIME_LEN_IF_NONE_MATCH;
1386
extern int TS_MIME_LEN_IF_RANGE;
1387
extern int TS_MIME_LEN_IF_UNMODIFIED_SINCE;
1388
extern int TS_MIME_LEN_KEEP_ALIVE;
1389
extern int TS_MIME_LEN_KEYWORDS;
1390
extern int TS_MIME_LEN_LAST_MODIFIED;
1391
extern int TS_MIME_LEN_LINES;
1392
extern int TS_MIME_LEN_LOCATION;
1393
extern int TS_MIME_LEN_MAX_FORWARDS;
1394
extern int TS_MIME_LEN_MESSAGE_ID;
1395
extern int TS_MIME_LEN_NEWSGROUPS;
1396
extern int TS_MIME_LEN_ORGANIZATION;
1397
extern int TS_MIME_LEN_PATH;
1398
extern int TS_MIME_LEN_PRAGMA;
1399
extern int TS_MIME_LEN_PROXY_AUTHENTICATE;
1400
extern int TS_MIME_LEN_PROXY_AUTHORIZATION;
1401
extern int TS_MIME_LEN_PROXY_CONNECTION;
1402
extern int TS_MIME_LEN_PUBLIC;
1403
extern int TS_MIME_LEN_RANGE;
1404
extern int TS_MIME_LEN_REFERENCES;
1405
extern int TS_MIME_LEN_REFERER;
1406
extern int TS_MIME_LEN_REPLY_TO;
1407
extern int TS_MIME_LEN_RETRY_AFTER;
1408
extern int TS_MIME_LEN_SENDER;
1409
extern int TS_MIME_LEN_SERVER;
1410
extern int TS_MIME_LEN_SET_COOKIE;
1411
extern int TS_MIME_LEN_STRICT_TRANSPORT_SECURITY;
1412
extern int TS_MIME_LEN_SUBJECT;
1413
extern int TS_MIME_LEN_SUMMARY;
1414
extern int TS_MIME_LEN_TE;
1415
extern int TS_MIME_LEN_TRANSFER_ENCODING;
1416
extern int TS_MIME_LEN_UPGRADE;
1417
extern int TS_MIME_LEN_USER_AGENT;
1418
extern int TS_MIME_LEN_VARY;
1419
extern int TS_MIME_LEN_VIA;
1420
extern int TS_MIME_LEN_WARNING;
1421
extern int TS_MIME_LEN_WWW_AUTHENTICATE;
1422
extern int TS_MIME_LEN_XREF;
1423
extern int TS_MIME_LEN_X_FORWARDED_FOR;
1424
extern int TS_MIME_LEN_FORWARDED;
1425
1426
/* --------------------------------------------------------------------------
1427
   HTTP values */
1428
extern const char *TS_HTTP_VALUE_BYTES;
1429
extern const char *TS_HTTP_VALUE_CHUNKED;
1430
extern const char *TS_HTTP_VALUE_CLOSE;
1431
extern const char *TS_HTTP_VALUE_COMPRESS;
1432
extern const char *TS_HTTP_VALUE_DEFLATE;
1433
extern const char *TS_HTTP_VALUE_GZIP;
1434
extern const char *TS_HTTP_VALUE_BROTLI;
1435
extern const char *TS_HTTP_VALUE_ZSTD;
1436
extern const char *TS_HTTP_VALUE_IDENTITY;
1437
extern const char *TS_HTTP_VALUE_KEEP_ALIVE;
1438
extern const char *TS_HTTP_VALUE_MAX_AGE;
1439
extern const char *TS_HTTP_VALUE_MAX_STALE;
1440
extern const char *TS_HTTP_VALUE_MIN_FRESH;
1441
extern const char *TS_HTTP_VALUE_MUST_REVALIDATE;
1442
extern const char *TS_HTTP_VALUE_NONE;
1443
extern const char *TS_HTTP_VALUE_NO_CACHE;
1444
extern const char *TS_HTTP_VALUE_NO_STORE;
1445
extern const char *TS_HTTP_VALUE_NO_TRANSFORM;
1446
extern const char *TS_HTTP_VALUE_ONLY_IF_CACHED;
1447
extern const char *TS_HTTP_VALUE_PRIVATE;
1448
extern const char *TS_HTTP_VALUE_PROXY_REVALIDATE;
1449
extern const char *TS_HTTP_VALUE_PUBLIC;
1450
1451
/* --------------------------------------------------------------------------
1452
   HTTP values string lengths */
1453
extern int TS_HTTP_LEN_BYTES;
1454
extern int TS_HTTP_LEN_CHUNKED;
1455
extern int TS_HTTP_LEN_CLOSE;
1456
extern int TS_HTTP_LEN_COMPRESS;
1457
extern int TS_HTTP_LEN_DEFLATE;
1458
extern int TS_HTTP_LEN_GZIP;
1459
extern int TS_HTTP_LEN_BROTLI;
1460
extern int TS_HTTP_LEN_ZSTD;
1461
extern int TS_HTTP_LEN_IDENTITY;
1462
extern int TS_HTTP_LEN_KEEP_ALIVE;
1463
extern int TS_HTTP_LEN_MAX_AGE;
1464
extern int TS_HTTP_LEN_MAX_STALE;
1465
extern int TS_HTTP_LEN_MIN_FRESH;
1466
extern int TS_HTTP_LEN_MUST_REVALIDATE;
1467
extern int TS_HTTP_LEN_NONE;
1468
extern int TS_HTTP_LEN_NO_CACHE;
1469
extern int TS_HTTP_LEN_NO_STORE;
1470
extern int TS_HTTP_LEN_NO_TRANSFORM;
1471
extern int TS_HTTP_LEN_ONLY_IF_CACHED;
1472
extern int TS_HTTP_LEN_PRIVATE;
1473
extern int TS_HTTP_LEN_PROXY_REVALIDATE;
1474
extern int TS_HTTP_LEN_PUBLIC;
1475
1476
/* --------------------------------------------------------------------------
1477
   HTTP methods */
1478
extern const char *TS_HTTP_METHOD_CONNECT;
1479
extern const char *TS_HTTP_METHOD_DELETE;
1480
extern const char *TS_HTTP_METHOD_GET;
1481
extern const char *TS_HTTP_METHOD_HEAD;
1482
extern const char *TS_HTTP_METHOD_OPTIONS;
1483
extern const char *TS_HTTP_METHOD_POST;
1484
extern const char *TS_HTTP_METHOD_PURGE;
1485
extern const char *TS_HTTP_METHOD_PUT;
1486
extern const char *TS_HTTP_METHOD_TRACE;
1487
extern const char *TS_HTTP_METHOD_PUSH;
1488
1489
/* --------------------------------------------------------------------------
1490
   HTTP methods string lengths */
1491
extern int TS_HTTP_LEN_CONNECT;
1492
extern int TS_HTTP_LEN_DELETE;
1493
extern int TS_HTTP_LEN_GET;
1494
extern int TS_HTTP_LEN_HEAD;
1495
extern int TS_HTTP_LEN_OPTIONS;
1496
extern int TS_HTTP_LEN_POST;
1497
extern int TS_HTTP_LEN_PURGE;
1498
extern int TS_HTTP_LEN_PUT;
1499
extern int TS_HTTP_LEN_TRACE;
1500
extern int TS_HTTP_LEN_PUSH;
1501
1502
/* --------------------------------------------------------------------------
1503
   TLS Next Protocol well-known protocol names. */
1504
1505
extern const char *const TS_ALPN_PROTOCOL_HTTP_0_9;
1506
extern const char *const TS_ALPN_PROTOCOL_HTTP_1_0;
1507
extern const char *const TS_ALPN_PROTOCOL_HTTP_1_1;
1508
extern const char *const TS_ALPN_PROTOCOL_HTTP_2_0;
1509
extern const char *const TS_ALPN_PROTOCOL_HTTP_3;
1510
extern const char *const TS_ALPN_PROTOCOL_HTTP_3_D29;
1511
extern const char *const TS_ALPN_PROTOCOL_HTTP_QUIC;
1512
extern const char *const TS_ALPN_PROTOCOL_HTTP_QUIC_D29;
1513
1514
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_0_9;
1515
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_1_0;
1516
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_1_1;
1517
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_2_0;
1518
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_3;
1519
extern int TS_ALPN_PROTOCOL_INDEX_HTTP_QUIC;
1520
1521
extern const char *const TS_ALPN_PROTOCOL_GROUP_HTTP;
1522
extern const char *const TS_ALPN_PROTOCOL_GROUP_HTTP2;
1523
1524
extern const char *const TS_PROTO_TAG_HTTP_1_0;
1525
extern const char *const TS_PROTO_TAG_HTTP_1_1;
1526
extern const char *const TS_PROTO_TAG_HTTP_2_0;
1527
extern const char *const TS_PROTO_TAG_HTTP_3;
1528
extern const char *const TS_PROTO_TAG_HTTP_QUIC;
1529
extern const char *const TS_PROTO_TAG_TLS_1_3;
1530
extern const char *const TS_PROTO_TAG_TLS_1_2;
1531
extern const char *const TS_PROTO_TAG_TLS_1_1;
1532
extern const char *const TS_PROTO_TAG_TLS_1_0;
1533
extern const char *const TS_PROTO_TAG_TCP;
1534
extern const char *const TS_PROTO_TAG_UDP;
1535
extern const char *const TS_PROTO_TAG_IPV4;
1536
extern const char *const TS_PROTO_TAG_IPV6;
1537
1538
/* --------------------------------------------------------------------------
1539
   MLoc Constants */
1540
/**
1541
    Use TS_NULL_MLOC as the parent in calls that require a parent
1542
    when an TSMLoc does not have a parent TSMLoc. For example if
1543
    the TSMLoc is obtained by a call to TSHttpTxnClientReqGet(),
1544
1545
 */
1546
TSMLoc const TS_NULL_MLOC = nullptr;
1547
1548
/* --------------------------------------------------------------------------
1549
   HostStatus types */
1550
1551
enum TSHostStatus {
1552
  TS_HOST_STATUS_INIT,
1553
  TS_HOST_STATUS_DOWN,
1554
  TS_HOST_STATUS_UP,
1555
};
1556
1557
/* MUST match proxy/HostStatus.h Reason.
1558
 * If a value is added here, it MUST be added there with the same value.
1559
 */
1560
enum TSHostStatusReason {
1561
  TS_HOST_STATUS_ACTIVE      = 0x1,
1562
  TS_HOST_STATUS_LOCAL       = 0x2,
1563
  TS_HOST_STATUS_MANUAL      = 0x4,
1564
  TS_HOST_STATUS_SELF_DETECT = 0x8,
1565
  TS_HOST_STATUS_ALL         = 0xf,
1566
};
1567
1568
/* --------------------------------------------------------------------------
1569
   Interface for the UUID APIs. https://www.ietf.org/rfc/rfc4122.txt. */
1570
enum TSUuidVersion {
1571
  TS_UUID_UNDEFINED = 0,
1572
  TS_UUID_V1        = 1,
1573
  TS_UUID_V2,
1574
  TS_UUID_V3,
1575
  TS_UUID_V4, /* At this point, this is the only implemented version (or variant) */
1576
  TS_UUID_V5,
1577
};
1578
1579
const int TS_UUID_STRING_LEN   = 36;
1580
const int TS_CRUUID_STRING_LEN = TS_UUID_STRING_LEN + 19 + 1; /* UUID-len + len(uint64_t) + '-' */
1581
using TSUuid                   = struct tsapi_uuid *;
1582
1583
/* Various HTTP "control" modes */
1584
enum TSHttpCntlType {
1585
  TS_HTTP_CNTL_LOGGING_MODE,
1586
  TS_HTTP_CNTL_INTERCEPT_RETRY_MODE,
1587
  TS_HTTP_CNTL_RESPONSE_CACHEABLE,
1588
  TS_HTTP_CNTL_REQUEST_CACHEABLE,
1589
  TS_HTTP_CNTL_SERVER_NO_STORE,
1590
  TS_HTTP_CNTL_TXN_DEBUG,
1591
  TS_HTTP_CNTL_SKIP_REMAPPING,
1592
};
1593
1594
// JSONRPC 2.0 related interface.
1595
using TSRPCProviderHandle = struct tsapi_rpcproviderhandle *;
1596
using TSYaml              = struct tsapi_yaml *;
1597
1598
///
1599
/// @brief JSON-RPC Handler options
1600
///
1601
/// This class holds information about how a handler will be managed and delivered when called. The JSON-RPC manager would use
1602
/// this object to perform certain validation.
1603
///
1604
struct TSRPCHandlerOptions {
1605
  struct Auth {
1606
    int restricted; ///< Tells the RPC Manager if the call can be delivered or not based on the config rules.
1607
  } auth{1};
1608
};
1609
1610
/// Configuration field info related to a parsed YAML node.
1611
///
1612
/// This contains information about the parsed record field. This will be passed back to the @a TSYAMLRecNodeHandler
1613
/// when you call @a TSRecYAMLConfigParse. This class holds the record name as well as the YAML node in case the caller
1614
/// wants to use this information to manipulate the record.
1615
struct TSYAMLRecCfgFieldData {
1616
  const char *field_name;  ///< YAML field name. null terminated
1617
  const char *record_name; ///< record name. null terminated
1618
  TSYaml      value_node;  ///< YAML::Node pointer.
1619
};
1620
1621
typedef enum {
1622
  TS_TXN_TYPE_UNKNOWN,
1623
  TS_TXN_TYPE_HTTP,
1624
  TS_TXN_TYPE_EXPLICIT_TUNNEL,
1625
  TS_TXN_TYPE_TR_PASS_TUNNEL,
1626
} TSTxnType;
1627
1628
/// Exposed for custom parent selection behavior.
1629
///
1630
/// This can used in association with TS_EVENT_HTTP_OS_DNS.
1631
/// Plugins may set this to indicate how to retry.
1632
/// If handled false:
1633
///   then no plugin set it and Core will proceed to do its own thing.
1634
/// If handled true:
1635
///   core will not do any parent processing, markdown, or anything else,
1636
///   but will use the values in this for whether to use the existing
1637
///   response or make another request
1638
struct TSResponseAction {
1639
  char const *hostname;     ///< host for next request (must be null terminated?)
1640
  size_t      hostname_len; ///< host len for next request (not including null)
1641
  in_port_t   port;         ///< port for next request
1642
  bool        fail;
1643
  bool        is_retry;
1644
  bool        nextHopExists;
1645
  bool        responseIsRetryable;
1646
  bool        goDirect;
1647
  bool        parentIsProxy;
1648
  bool        no_cache;
1649
};
1650
1651
enum TSLogType {
1652
  TS_LOG_TYPE_INT,
1653
  // DINT is omitted from the public API for now, until we decide whether we keep the type
1654
  TS_LOG_TYPE_STRING = 2,
1655
  TS_LOG_TYPE_ADDR   = 3,
1656
};
1657
1658
/* --------------------------------------------------------------------------
1659
   Init */
1660
1661
/**
1662
    This function must be defined by all plugins. Traffic Server
1663
    calls this initialization routine when it loads the plugin (at
1664
    startup), and sets argc and argv appropriately based on the values
1665
    in plugin.config.  (Functions linked dynamically, and called using
1666
    dlsym() must be undecorated / extern "C".)
1667
1668
    @param argc the number of initial values specified in plugin.config,
1669
      plus one. If only the name of your plugin shared object is
1670
      specified in plugin.config, argc=1.
1671
    @param argv the vector of arguments. The length of argv is argc.
1672
      argv[0] is the name of the plugin shared library. Subsequent
1673
      values of argv are initialization values specified in
1674
      plugin.config.
1675
1676
 */
1677
extern "C" void TSPluginInit(int argc, const char *argv[]);
1678
1679
namespace ts
1680
{
1681
static const int NO_FD = -1; ///< No or invalid file descriptor.
1682
}
1683
1684
#ifndef ATS_BUILD
1685
1686
#endif