annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/curl/multi.h @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
rev   line source
jpayne@69 1 #ifndef CURLINC_MULTI_H
jpayne@69 2 #define CURLINC_MULTI_H
jpayne@69 3 /***************************************************************************
jpayne@69 4 * _ _ ____ _
jpayne@69 5 * Project ___| | | | _ \| |
jpayne@69 6 * / __| | | | |_) | |
jpayne@69 7 * | (__| |_| | _ <| |___
jpayne@69 8 * \___|\___/|_| \_\_____|
jpayne@69 9 *
jpayne@69 10 * Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
jpayne@69 11 *
jpayne@69 12 * This software is licensed as described in the file COPYING, which
jpayne@69 13 * you should have received as part of this distribution. The terms
jpayne@69 14 * are also available at https://curl.se/docs/copyright.html.
jpayne@69 15 *
jpayne@69 16 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
jpayne@69 17 * copies of the Software, and permit persons to whom the Software is
jpayne@69 18 * furnished to do so, under the terms of the COPYING file.
jpayne@69 19 *
jpayne@69 20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
jpayne@69 21 * KIND, either express or implied.
jpayne@69 22 *
jpayne@69 23 * SPDX-License-Identifier: curl
jpayne@69 24 *
jpayne@69 25 ***************************************************************************/
jpayne@69 26 /*
jpayne@69 27 This is an "external" header file. Don't give away any internals here!
jpayne@69 28
jpayne@69 29 GOALS
jpayne@69 30
jpayne@69 31 o Enable a "pull" interface. The application that uses libcurl decides where
jpayne@69 32 and when to ask libcurl to get/send data.
jpayne@69 33
jpayne@69 34 o Enable multiple simultaneous transfers in the same thread without making it
jpayne@69 35 complicated for the application.
jpayne@69 36
jpayne@69 37 o Enable the application to select() on its own file descriptors and curl's
jpayne@69 38 file descriptors simultaneous easily.
jpayne@69 39
jpayne@69 40 */
jpayne@69 41
jpayne@69 42 /*
jpayne@69 43 * This header file should not really need to include "curl.h" since curl.h
jpayne@69 44 * itself includes this file and we expect user applications to do #include
jpayne@69 45 * <curl/curl.h> without the need for especially including multi.h.
jpayne@69 46 *
jpayne@69 47 * For some reason we added this include here at one point, and rather than to
jpayne@69 48 * break existing (wrongly written) libcurl applications, we leave it as-is
jpayne@69 49 * but with this warning attached.
jpayne@69 50 */
jpayne@69 51 #include "curl.h"
jpayne@69 52
jpayne@69 53 #ifdef __cplusplus
jpayne@69 54 extern "C" {
jpayne@69 55 #endif
jpayne@69 56
jpayne@69 57 #if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
jpayne@69 58 typedef struct Curl_multi CURLM;
jpayne@69 59 #else
jpayne@69 60 typedef void CURLM;
jpayne@69 61 #endif
jpayne@69 62
jpayne@69 63 typedef enum {
jpayne@69 64 CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or
jpayne@69 65 curl_multi_socket*() soon */
jpayne@69 66 CURLM_OK,
jpayne@69 67 CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */
jpayne@69 68 CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
jpayne@69 69 CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */
jpayne@69 70 CURLM_INTERNAL_ERROR, /* this is a libcurl bug */
jpayne@69 71 CURLM_BAD_SOCKET, /* the passed in socket argument did not match */
jpayne@69 72 CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */
jpayne@69 73 CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was
jpayne@69 74 attempted to get added - again */
jpayne@69 75 CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
jpayne@69 76 callback */
jpayne@69 77 CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
jpayne@69 78 CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */
jpayne@69 79 CURLM_ABORTED_BY_CALLBACK,
jpayne@69 80 CURLM_UNRECOVERABLE_POLL,
jpayne@69 81 CURLM_LAST
jpayne@69 82 } CURLMcode;
jpayne@69 83
jpayne@69 84 /* just to make code nicer when using curl_multi_socket() you can now check
jpayne@69 85 for CURLM_CALL_MULTI_SOCKET too in the same style it works for
jpayne@69 86 curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */
jpayne@69 87 #define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM
jpayne@69 88
jpayne@69 89 /* bitmask bits for CURLMOPT_PIPELINING */
jpayne@69 90 #define CURLPIPE_NOTHING 0L
jpayne@69 91 #define CURLPIPE_HTTP1 1L
jpayne@69 92 #define CURLPIPE_MULTIPLEX 2L
jpayne@69 93
jpayne@69 94 typedef enum {
jpayne@69 95 CURLMSG_NONE, /* first, not used */
jpayne@69 96 CURLMSG_DONE, /* This easy handle has completed. 'result' contains
jpayne@69 97 the CURLcode of the transfer */
jpayne@69 98 CURLMSG_LAST /* last, not used */
jpayne@69 99 } CURLMSG;
jpayne@69 100
jpayne@69 101 struct CURLMsg {
jpayne@69 102 CURLMSG msg; /* what this message means */
jpayne@69 103 CURL *easy_handle; /* the handle it concerns */
jpayne@69 104 union {
jpayne@69 105 void *whatever; /* message-specific data */
jpayne@69 106 CURLcode result; /* return code for transfer */
jpayne@69 107 } data;
jpayne@69 108 };
jpayne@69 109 typedef struct CURLMsg CURLMsg;
jpayne@69 110
jpayne@69 111 /* Based on poll(2) structure and values.
jpayne@69 112 * We don't use pollfd and POLL* constants explicitly
jpayne@69 113 * to cover platforms without poll(). */
jpayne@69 114 #define CURL_WAIT_POLLIN 0x0001
jpayne@69 115 #define CURL_WAIT_POLLPRI 0x0002
jpayne@69 116 #define CURL_WAIT_POLLOUT 0x0004
jpayne@69 117
jpayne@69 118 struct curl_waitfd {
jpayne@69 119 curl_socket_t fd;
jpayne@69 120 short events;
jpayne@69 121 short revents; /* not supported yet */
jpayne@69 122 };
jpayne@69 123
jpayne@69 124 /*
jpayne@69 125 * Name: curl_multi_init()
jpayne@69 126 *
jpayne@69 127 * Desc: initialize multi-style curl usage
jpayne@69 128 *
jpayne@69 129 * Returns: a new CURLM handle to use in all 'curl_multi' functions.
jpayne@69 130 */
jpayne@69 131 CURL_EXTERN CURLM *curl_multi_init(void);
jpayne@69 132
jpayne@69 133 /*
jpayne@69 134 * Name: curl_multi_add_handle()
jpayne@69 135 *
jpayne@69 136 * Desc: add a standard curl handle to the multi stack
jpayne@69 137 *
jpayne@69 138 * Returns: CURLMcode type, general multi error code.
jpayne@69 139 */
jpayne@69 140 CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
jpayne@69 141 CURL *curl_handle);
jpayne@69 142
jpayne@69 143 /*
jpayne@69 144 * Name: curl_multi_remove_handle()
jpayne@69 145 *
jpayne@69 146 * Desc: removes a curl handle from the multi stack again
jpayne@69 147 *
jpayne@69 148 * Returns: CURLMcode type, general multi error code.
jpayne@69 149 */
jpayne@69 150 CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
jpayne@69 151 CURL *curl_handle);
jpayne@69 152
jpayne@69 153 /*
jpayne@69 154 * Name: curl_multi_fdset()
jpayne@69 155 *
jpayne@69 156 * Desc: Ask curl for its fd_set sets. The app can use these to select() or
jpayne@69 157 * poll() on. We want curl_multi_perform() called as soon as one of
jpayne@69 158 * them are ready.
jpayne@69 159 *
jpayne@69 160 * Returns: CURLMcode type, general multi error code.
jpayne@69 161 */
jpayne@69 162 CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
jpayne@69 163 fd_set *read_fd_set,
jpayne@69 164 fd_set *write_fd_set,
jpayne@69 165 fd_set *exc_fd_set,
jpayne@69 166 int *max_fd);
jpayne@69 167
jpayne@69 168 /*
jpayne@69 169 * Name: curl_multi_wait()
jpayne@69 170 *
jpayne@69 171 * Desc: Poll on all fds within a CURLM set as well as any
jpayne@69 172 * additional fds passed to the function.
jpayne@69 173 *
jpayne@69 174 * Returns: CURLMcode type, general multi error code.
jpayne@69 175 */
jpayne@69 176 CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
jpayne@69 177 struct curl_waitfd extra_fds[],
jpayne@69 178 unsigned int extra_nfds,
jpayne@69 179 int timeout_ms,
jpayne@69 180 int *ret);
jpayne@69 181
jpayne@69 182 /*
jpayne@69 183 * Name: curl_multi_poll()
jpayne@69 184 *
jpayne@69 185 * Desc: Poll on all fds within a CURLM set as well as any
jpayne@69 186 * additional fds passed to the function.
jpayne@69 187 *
jpayne@69 188 * Returns: CURLMcode type, general multi error code.
jpayne@69 189 */
jpayne@69 190 CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
jpayne@69 191 struct curl_waitfd extra_fds[],
jpayne@69 192 unsigned int extra_nfds,
jpayne@69 193 int timeout_ms,
jpayne@69 194 int *ret);
jpayne@69 195
jpayne@69 196 /*
jpayne@69 197 * Name: curl_multi_wakeup()
jpayne@69 198 *
jpayne@69 199 * Desc: wakes up a sleeping curl_multi_poll call.
jpayne@69 200 *
jpayne@69 201 * Returns: CURLMcode type, general multi error code.
jpayne@69 202 */
jpayne@69 203 CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
jpayne@69 204
jpayne@69 205 /*
jpayne@69 206 * Name: curl_multi_perform()
jpayne@69 207 *
jpayne@69 208 * Desc: When the app thinks there's data available for curl it calls this
jpayne@69 209 * function to read/write whatever there is right now. This returns
jpayne@69 210 * as soon as the reads and writes are done. This function does not
jpayne@69 211 * require that there actually is data available for reading or that
jpayne@69 212 * data can be written, it can be called just in case. It returns
jpayne@69 213 * the number of handles that still transfer data in the second
jpayne@69 214 * argument's integer-pointer.
jpayne@69 215 *
jpayne@69 216 * Returns: CURLMcode type, general multi error code. *NOTE* that this only
jpayne@69 217 * returns errors etc regarding the whole multi stack. There might
jpayne@69 218 * still have occurred problems on individual transfers even when
jpayne@69 219 * this returns OK.
jpayne@69 220 */
jpayne@69 221 CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
jpayne@69 222 int *running_handles);
jpayne@69 223
jpayne@69 224 /*
jpayne@69 225 * Name: curl_multi_cleanup()
jpayne@69 226 *
jpayne@69 227 * Desc: Cleans up and removes a whole multi stack. It does not free or
jpayne@69 228 * touch any individual easy handles in any way. We need to define
jpayne@69 229 * in what state those handles will be if this function is called
jpayne@69 230 * in the middle of a transfer.
jpayne@69 231 *
jpayne@69 232 * Returns: CURLMcode type, general multi error code.
jpayne@69 233 */
jpayne@69 234 CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
jpayne@69 235
jpayne@69 236 /*
jpayne@69 237 * Name: curl_multi_info_read()
jpayne@69 238 *
jpayne@69 239 * Desc: Ask the multi handle if there's any messages/informationals from
jpayne@69 240 * the individual transfers. Messages include informationals such as
jpayne@69 241 * error code from the transfer or just the fact that a transfer is
jpayne@69 242 * completed. More details on these should be written down as well.
jpayne@69 243 *
jpayne@69 244 * Repeated calls to this function will return a new struct each
jpayne@69 245 * time, until a special "end of msgs" struct is returned as a signal
jpayne@69 246 * that there is no more to get at this point.
jpayne@69 247 *
jpayne@69 248 * The data the returned pointer points to will not survive calling
jpayne@69 249 * curl_multi_cleanup().
jpayne@69 250 *
jpayne@69 251 * The 'CURLMsg' struct is meant to be very simple and only contain
jpayne@69 252 * very basic information. If more involved information is wanted,
jpayne@69 253 * we will provide the particular "transfer handle" in that struct
jpayne@69 254 * and that should/could/would be used in subsequent
jpayne@69 255 * curl_easy_getinfo() calls (or similar). The point being that we
jpayne@69 256 * must never expose complex structs to applications, as then we'll
jpayne@69 257 * undoubtably get backwards compatibility problems in the future.
jpayne@69 258 *
jpayne@69 259 * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out
jpayne@69 260 * of structs. It also writes the number of messages left in the
jpayne@69 261 * queue (after this read) in the integer the second argument points
jpayne@69 262 * to.
jpayne@69 263 */
jpayne@69 264 CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
jpayne@69 265 int *msgs_in_queue);
jpayne@69 266
jpayne@69 267 /*
jpayne@69 268 * Name: curl_multi_strerror()
jpayne@69 269 *
jpayne@69 270 * Desc: The curl_multi_strerror function may be used to turn a CURLMcode
jpayne@69 271 * value into the equivalent human readable error string. This is
jpayne@69 272 * useful for printing meaningful error messages.
jpayne@69 273 *
jpayne@69 274 * Returns: A pointer to a null-terminated error message.
jpayne@69 275 */
jpayne@69 276 CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
jpayne@69 277
jpayne@69 278 /*
jpayne@69 279 * Name: curl_multi_socket() and
jpayne@69 280 * curl_multi_socket_all()
jpayne@69 281 *
jpayne@69 282 * Desc: An alternative version of curl_multi_perform() that allows the
jpayne@69 283 * application to pass in one of the file descriptors that have been
jpayne@69 284 * detected to have "action" on them and let libcurl perform.
jpayne@69 285 * See man page for details.
jpayne@69 286 */
jpayne@69 287 #define CURL_POLL_NONE 0
jpayne@69 288 #define CURL_POLL_IN 1
jpayne@69 289 #define CURL_POLL_OUT 2
jpayne@69 290 #define CURL_POLL_INOUT 3
jpayne@69 291 #define CURL_POLL_REMOVE 4
jpayne@69 292
jpayne@69 293 #define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD
jpayne@69 294
jpayne@69 295 #define CURL_CSELECT_IN 0x01
jpayne@69 296 #define CURL_CSELECT_OUT 0x02
jpayne@69 297 #define CURL_CSELECT_ERR 0x04
jpayne@69 298
jpayne@69 299 typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */
jpayne@69 300 curl_socket_t s, /* socket */
jpayne@69 301 int what, /* see above */
jpayne@69 302 void *userp, /* private callback
jpayne@69 303 pointer */
jpayne@69 304 void *socketp); /* private socket
jpayne@69 305 pointer */
jpayne@69 306 /*
jpayne@69 307 * Name: curl_multi_timer_callback
jpayne@69 308 *
jpayne@69 309 * Desc: Called by libcurl whenever the library detects a change in the
jpayne@69 310 * maximum number of milliseconds the app is allowed to wait before
jpayne@69 311 * curl_multi_socket() or curl_multi_perform() must be called
jpayne@69 312 * (to allow libcurl's timed events to take place).
jpayne@69 313 *
jpayne@69 314 * Returns: The callback should return zero.
jpayne@69 315 */
jpayne@69 316 typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */
jpayne@69 317 long timeout_ms, /* see above */
jpayne@69 318 void *userp); /* private callback
jpayne@69 319 pointer */
jpayne@69 320
jpayne@69 321 CURL_EXTERN CURLMcode CURL_DEPRECATED(7.19.5, "Use curl_multi_socket_action()")
jpayne@69 322 curl_multi_socket(CURLM *multi_handle, curl_socket_t s, int *running_handles);
jpayne@69 323
jpayne@69 324 CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
jpayne@69 325 curl_socket_t s,
jpayne@69 326 int ev_bitmask,
jpayne@69 327 int *running_handles);
jpayne@69 328
jpayne@69 329 CURL_EXTERN CURLMcode CURL_DEPRECATED(7.19.5, "Use curl_multi_socket_action()")
jpayne@69 330 curl_multi_socket_all(CURLM *multi_handle, int *running_handles);
jpayne@69 331
jpayne@69 332 #ifndef CURL_ALLOW_OLD_MULTI_SOCKET
jpayne@69 333 /* This macro below was added in 7.16.3 to push users who recompile to use
jpayne@69 334 the new curl_multi_socket_action() instead of the old curl_multi_socket()
jpayne@69 335 */
jpayne@69 336 #define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)
jpayne@69 337 #endif
jpayne@69 338
jpayne@69 339 /*
jpayne@69 340 * Name: curl_multi_timeout()
jpayne@69 341 *
jpayne@69 342 * Desc: Returns the maximum number of milliseconds the app is allowed to
jpayne@69 343 * wait before curl_multi_socket() or curl_multi_perform() must be
jpayne@69 344 * called (to allow libcurl's timed events to take place).
jpayne@69 345 *
jpayne@69 346 * Returns: CURLM error code.
jpayne@69 347 */
jpayne@69 348 CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
jpayne@69 349 long *milliseconds);
jpayne@69 350
jpayne@69 351 typedef enum {
jpayne@69 352 /* This is the socket callback function pointer */
jpayne@69 353 CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
jpayne@69 354
jpayne@69 355 /* This is the argument passed to the socket callback */
jpayne@69 356 CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2),
jpayne@69 357
jpayne@69 358 /* set to 1 to enable pipelining for this multi handle */
jpayne@69 359 CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3),
jpayne@69 360
jpayne@69 361 /* This is the timer callback function pointer */
jpayne@69 362 CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4),
jpayne@69 363
jpayne@69 364 /* This is the argument passed to the timer callback */
jpayne@69 365 CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5),
jpayne@69 366
jpayne@69 367 /* maximum number of entries in the connection cache */
jpayne@69 368 CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6),
jpayne@69 369
jpayne@69 370 /* maximum number of (pipelining) connections to one host */
jpayne@69 371 CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7),
jpayne@69 372
jpayne@69 373 /* maximum number of requests in a pipeline */
jpayne@69 374 CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8),
jpayne@69 375
jpayne@69 376 /* a connection with a content-length longer than this
jpayne@69 377 will not be considered for pipelining */
jpayne@69 378 CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9),
jpayne@69 379
jpayne@69 380 /* a connection with a chunk length longer than this
jpayne@69 381 will not be considered for pipelining */
jpayne@69 382 CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10),
jpayne@69 383
jpayne@69 384 /* a list of site names(+port) that are blocked from pipelining */
jpayne@69 385 CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11),
jpayne@69 386
jpayne@69 387 /* a list of server types that are blocked from pipelining */
jpayne@69 388 CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12),
jpayne@69 389
jpayne@69 390 /* maximum number of open connections in total */
jpayne@69 391 CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13),
jpayne@69 392
jpayne@69 393 /* This is the server push callback function pointer */
jpayne@69 394 CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14),
jpayne@69 395
jpayne@69 396 /* This is the argument passed to the server push callback */
jpayne@69 397 CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15),
jpayne@69 398
jpayne@69 399 /* maximum number of concurrent streams to support on a connection */
jpayne@69 400 CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
jpayne@69 401
jpayne@69 402 CURLMOPT_LASTENTRY /* the last unused */
jpayne@69 403 } CURLMoption;
jpayne@69 404
jpayne@69 405
jpayne@69 406 /*
jpayne@69 407 * Name: curl_multi_setopt()
jpayne@69 408 *
jpayne@69 409 * Desc: Sets options for the multi handle.
jpayne@69 410 *
jpayne@69 411 * Returns: CURLM error code.
jpayne@69 412 */
jpayne@69 413 CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,
jpayne@69 414 CURLMoption option, ...);
jpayne@69 415
jpayne@69 416
jpayne@69 417 /*
jpayne@69 418 * Name: curl_multi_assign()
jpayne@69 419 *
jpayne@69 420 * Desc: This function sets an association in the multi handle between the
jpayne@69 421 * given socket and a private pointer of the application. This is
jpayne@69 422 * (only) useful for curl_multi_socket uses.
jpayne@69 423 *
jpayne@69 424 * Returns: CURLM error code.
jpayne@69 425 */
jpayne@69 426 CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
jpayne@69 427 curl_socket_t sockfd, void *sockp);
jpayne@69 428
jpayne@69 429
jpayne@69 430 /*
jpayne@69 431 * Name: curl_push_callback
jpayne@69 432 *
jpayne@69 433 * Desc: This callback gets called when a new stream is being pushed by the
jpayne@69 434 * server. It approves or denies the new stream. It can also decide
jpayne@69 435 * to completely fail the connection.
jpayne@69 436 *
jpayne@69 437 * Returns: CURL_PUSH_OK, CURL_PUSH_DENY or CURL_PUSH_ERROROUT
jpayne@69 438 */
jpayne@69 439 #define CURL_PUSH_OK 0
jpayne@69 440 #define CURL_PUSH_DENY 1
jpayne@69 441 #define CURL_PUSH_ERROROUT 2 /* added in 7.72.0 */
jpayne@69 442
jpayne@69 443 struct curl_pushheaders; /* forward declaration only */
jpayne@69 444
jpayne@69 445 CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h,
jpayne@69 446 size_t num);
jpayne@69 447 CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h,
jpayne@69 448 const char *name);
jpayne@69 449
jpayne@69 450 typedef int (*curl_push_callback)(CURL *parent,
jpayne@69 451 CURL *easy,
jpayne@69 452 size_t num_headers,
jpayne@69 453 struct curl_pushheaders *headers,
jpayne@69 454 void *userp);
jpayne@69 455
jpayne@69 456 #ifdef __cplusplus
jpayne@69 457 } /* end of extern "C" */
jpayne@69 458 #endif
jpayne@69 459
jpayne@69 460 #endif