Files
wget2/libwget/http.h
Tim Rühsen ec27488fea Fix downloading multiple files via HTTP/2
* include/wget/wget.h: New function declaration wget_http_connection_receive_only().
* libwget/http.c: New function definition wget_http_connection_receive_only().
* libwget/http.h (struct wget_http_connection_st): Add member goaway.
* libwget/http2.c (struct http2_stream_context): Add member conn,
  (on_frame_recv_callback): Handle NGHTTP2_GOAWAY,
  (wget_http2_send_request): Initialize conn member.
* src/host.c (_release_job): Don't release parts if in 'done' state.
* src/wget.c (process_response_header): Remove handling of LINK headers,
  (process_response): Add handling of LINK headers,
  (downloader_thread): Handle pending responses correctly.

This patch fixes two related issues:
1. With HTTP/2, servers sometimes limit the number of requests per connection.
   Beforethis patch, the connection was closed too early after GOAWAY and pending
   responses weren't received.
2. In _release_job(), already downloaded parts of a file were erroneous released.
   This caused successful metalink and chunked downloads to fail in combination with
   a GOAWAY or a remotely closed connection.
2024-09-11 17:45:09 +02:00

100 lines
3.1 KiB
C

/*
* Copyright (c) 2017-2024 Free Software Foundation, Inc.
*
* This file is part of libwget.
*
* Libwget is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Libwget is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Libwget. If not, see <https://www.gnu.org/licenses/>.
*
*
* Header file for private HTTP structures
*/
#ifndef LIBWGET_HTTP_H
# define LIBWGET_HTTP_H
#ifdef WITH_LIBNGHTTP2
# include <nghttp2/nghttp2.h>
#endif
//wget_http_connection_t abstract type
struct wget_http_connection_st {
wget_tcp *
tcp;
const char *
esc_host;
wget_buffer *
buf;
#ifdef WITH_LIBNGHTTP2
nghttp2_session *
http2_session;
#endif
wget_vector
*pending_requests; // List of unresponsed requests (HTTP1 only)
wget_vector
*received_http2_responses; // List of received (but yet unprocessed) responses (HTTP2 only)
int
pending_http2_requests; // Number of unresponsed requests (HTTP2 only)
wget_iri_scheme
scheme;
uint16_t
port;
char
protocol; // WGET_PROTOCOL_HTTP_1_1 or WGET_PROTOCOL_HTTP_2_0
bool
print_response_headers : 1,
abort_indicator : 1,
proxied : 1,
goaway : 1;
};
/* HTTP/1.0 status codes from RFC1945 */
#define H_10X(x) (((x) >= 100) && ((x) < 200))
/* Successful 2xx. */
#define HTTP_STATUS_OK 200
#define HTTP_STATUS_CREATED 201
#define HTTP_STATUS_ACCEPTED 202
#define HTTP_STATUS_NO_CONTENT 204
#define HTTP_STATUS_PARTIAL_CONTENTS 206
/* Redirection 3xx. */
#define HTTP_STATUS_MULTIPLE_CHOICES 300
#define HTTP_STATUS_MOVED_PERMANENTLY 301
#define HTTP_STATUS_MOVED_TEMPORARILY 302
#define HTTP_STATUS_SEE_OTHER 303 /* from HTTP/1.1 */
#define HTTP_STATUS_NOT_MODIFIED 304
#define HTTP_STATUS_TEMPORARY_REDIRECT 307 /* from HTTP/1.1 */
/* Client error 4xx. */
#define HTTP_STATUS_BAD_REQUEST 400
#define HTTP_STATUS_UNAUTHORIZED 401
#define HTTP_STATUS_FORBIDDEN 403
#define HTTP_STATUS_NOT_FOUND 404
#define HTTP_STATUS_RANGE_NOT_SATISFIABLE 416
int http_connection_is_aborted(wget_http_connection *conn);
void http_fix_broken_server_encoding(wget_http_response *resp);
int http_get_body_cb(void *context, const char *data, size_t length);
int http_decompress_error_handler_cb(wget_decompressor *dc, int err);
int wget_http2_open(wget_http_connection *conn);
void wget_http2_close(wget_http_connection **conn);
int wget_http2_send_request(wget_http_connection *conn, wget_http_request *req);
wget_http_response *wget_http2_get_response_cb(wget_http_connection *conn,
wget_server_stats_callback *server_stats_callback);
#endif /* LIBWGET_HTTP_H */