mirror of
https://github.com/curl/curl.git
synced 2024-12-21 06:50:10 +08:00
50aa325742
`Curl_hyper_stream` needs to distinguish between two kinds of `HYPER_TASK_EMPTY` tasks: (a) the `foreach` tasks it creates itself, and (b) background tasks that hyper produces. It does this by recording the address of any `foreach` task in `hyptransfer->endtask` before pushing it into the executor, and then comparing that against the address of tasks later polled out of the executor. This works right now, but there is no guarantee from hyper that the addresses are stable. `hyper_executor_push` says "The executor takes ownership of the task, which should not be accessed again unless returned back to the user with `hyper_executor_poll`". That wording is a bit ambiguous but with my Rust programmer's hat on I read it as meaning the task returned with `hyper_executor_poll` may be conceptually the same as a task that was pushed, but that there are no other guarantees and comparing addresses is a bad idea. This commit instead uses `hyper_task_set_userdata` to mark the `foreach` task with a `USERDATA_RESP_BODY` value which can then be checked for, removing the need for `hyptransfer->endtask`. This makes the code look more like that hyper C API examples, which use userdata for every task and never look at task addresses. Closes #11779
60 lines
2.1 KiB
C
60 lines
2.1 KiB
C
#ifndef HEADER_CURL_HYPER_H
|
|
#define HEADER_CURL_HYPER_H
|
|
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
* SPDX-License-Identifier: curl
|
|
*
|
|
***************************************************************************/
|
|
#include "curl_setup.h"
|
|
|
|
#if !defined(CURL_DISABLE_HTTP) && defined(USE_HYPER)
|
|
|
|
#include <hyper.h>
|
|
|
|
/* per-transfer data for the Hyper backend */
|
|
struct hyptransfer {
|
|
hyper_waker *write_waker;
|
|
hyper_waker *read_waker;
|
|
const hyper_executor *exec;
|
|
hyper_waker *exp100_waker;
|
|
hyper_waker *send_body_waker;
|
|
};
|
|
|
|
size_t Curl_hyper_recv(void *userp, hyper_context *ctx,
|
|
uint8_t *buf, size_t buflen);
|
|
size_t Curl_hyper_send(void *userp, hyper_context *ctx,
|
|
const uint8_t *buf, size_t buflen);
|
|
CURLcode Curl_hyper_stream(struct Curl_easy *data,
|
|
struct connectdata *conn,
|
|
int *didwhat,
|
|
bool *done,
|
|
int select_res);
|
|
|
|
CURLcode Curl_hyper_header(struct Curl_easy *data, hyper_headers *headers,
|
|
const char *line);
|
|
void Curl_hyper_done(struct Curl_easy *);
|
|
|
|
#else
|
|
#define Curl_hyper_done(x)
|
|
|
|
#endif /* !defined(CURL_DISABLE_HTTP) && defined(USE_HYPER) */
|
|
#endif /* HEADER_CURL_HYPER_H */
|