avformat/gopher: Add support for Gopher over TLS

This commit adds a "gophers" handler to the gopher protocol. gophers
is a community-adopted protocol that acts the same way like normal
gopher with the added TLS encapsulation.

The gophers protocol is supported by gopher servers like geomydae(8),
and clients like curl(1), clic(1), and hurl(1).

This commit also adds compilation guards to both gopher and gophers,
since now there are two protocols in the file it makes sense to
have this addition.

Signed-off-by: parazyd <parazyd@dyne.org>
Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parazyd 2021-02-28 23:47:05 +01:00 committed by Marton Balint
parent ed4c2e183b
commit 51367267c8
8 changed files with 38 additions and 5 deletions

View File

@ -81,6 +81,7 @@ version <next>:
- TTML subtitle encoder and muxer - TTML subtitle encoder and muxer
- identity video filter - identity video filter
- msad video filter - msad video filter
- gophers protocol
version 4.3: version 4.3:

1
configure vendored
View File

@ -3450,6 +3450,7 @@ ffrtmphttp_protocol_conflict="librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol" ffrtmphttp_protocol_select="http_protocol"
ftp_protocol_select="tcp_protocol" ftp_protocol_select="tcp_protocol"
gopher_protocol_select="tcp_protocol" gopher_protocol_select="tcp_protocol"
gophers_protocol_select="tls_protocol"
http_protocol_select="tcp_protocol" http_protocol_select="tcp_protocol"
http_protocol_suggest="zlib" http_protocol_suggest="zlib"
httpproxy_protocol_select="tcp_protocol" httpproxy_protocol_select="tcp_protocol"

View File

@ -1371,6 +1371,7 @@ performance on systems without hardware floating point support).
@item file @tab X @item file @tab X
@item FTP @tab X @item FTP @tab X
@item Gopher @tab X @item Gopher @tab X
@item Gophers @tab X
@item HLS @tab X @item HLS @tab X
@item HTTP @tab X @item HTTP @tab X
@item HTTPS @tab X @item HTTPS @tab X

View File

@ -341,6 +341,12 @@ operation. ff* tools may produce incomplete content due to server limitations.
Gopher protocol. Gopher protocol.
@section gophers
Gophers protocol.
The Gopher protocol with TLS encapsulation.
@section hls @section hls
Read Apple HTTP Live Streaming compliant segmented stream as Read Apple HTTP Live Streaming compliant segmented stream as

View File

@ -621,6 +621,7 @@ OBJS-$(CONFIG_FFRTMPHTTP_PROTOCOL) += rtmphttp.o
OBJS-$(CONFIG_FILE_PROTOCOL) += file.o OBJS-$(CONFIG_FILE_PROTOCOL) += file.o
OBJS-$(CONFIG_FTP_PROTOCOL) += ftp.o urldecode.o OBJS-$(CONFIG_FTP_PROTOCOL) += ftp.o urldecode.o
OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o
OBJS-$(CONFIG_GOPHERS_PROTOCOL) += gopher.o
OBJS-$(CONFIG_HLS_PROTOCOL) += hlsproto.o OBJS-$(CONFIG_HLS_PROTOCOL) += hlsproto.o
OBJS-$(CONFIG_HTTP_PROTOCOL) += http.o httpauth.o urldecode.o OBJS-$(CONFIG_HTTP_PROTOCOL) += http.o httpauth.o urldecode.o
OBJS-$(CONFIG_HTTPPROXY_PROTOCOL) += http.o httpauth.o urldecode.o OBJS-$(CONFIG_HTTPPROXY_PROTOCOL) += http.o httpauth.o urldecode.o

View File

@ -2,6 +2,7 @@
* Gopher protocol * Gopher protocol
* *
* Copyright (c) 2009 Toshimitsu Kimura * Copyright (c) 2009 Toshimitsu Kimura
* Copyright (c) 2021 parazyd <parazyd@dyne.org>
* *
* based on libavformat/http.c, Copyright (c) 2000, 2001 Fabrice Bellard * based on libavformat/http.c, Copyright (c) 2000, 2001 Fabrice Bellard
* *
@ -22,6 +23,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "config.h"
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "avformat.h" #include "avformat.h"
#include "internal.h" #include "internal.h"
@ -75,19 +78,23 @@ static int gopher_close(URLContext *h)
static int gopher_open(URLContext *h, const char *uri, int flags) static int gopher_open(URLContext *h, const char *uri, int flags)
{ {
GopherContext *s = h->priv_data; GopherContext *s = h->priv_data;
char hostname[1024], auth[1024], path[1024], buf[1024]; char proto[10], hostname[1024], auth[1024], path[1024], buf[1024];
int port, err; int port, err;
const char *lower_proto = "tcp";
h->is_streamed = 1; h->is_streamed = 1;
/* needed in any case to build the host string */ /* needed in any case to build the host string */
av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, av_url_split(proto, sizeof(proto), auth, sizeof(auth),
path, sizeof(path), uri); hostname, sizeof(hostname), &port, path, sizeof(path), uri);
if (port < 0) if (port < 0)
port = 70; port = 70;
ff_url_join(buf, sizeof(buf), "tcp", NULL, hostname, port, NULL); if (!strcmp(proto, "gophers"))
lower_proto = "tls";
ff_url_join(buf, sizeof(buf), lower_proto, NULL, hostname, port, NULL);
s->hd = NULL; s->hd = NULL;
err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE, err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE,
@ -110,6 +117,7 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size)
return len; return len;
} }
#if CONFIG_GOPHER_PROTOCOL
const URLProtocol ff_gopher_protocol = { const URLProtocol ff_gopher_protocol = {
.name = "gopher", .name = "gopher",
.url_open = gopher_open, .url_open = gopher_open,
@ -120,3 +128,17 @@ const URLProtocol ff_gopher_protocol = {
.flags = URL_PROTOCOL_FLAG_NETWORK, .flags = URL_PROTOCOL_FLAG_NETWORK,
.default_whitelist = "gopher,tcp" .default_whitelist = "gopher,tcp"
}; };
#endif /* CONFIG_GOPHER_PROTOCOL */
#if CONFIG_GOPHERS_PROTOCOL
const URLProtocol ff_gophers_protocol = {
.name = "gophers",
.url_open = gopher_open,
.url_read = gopher_read,
.url_write = gopher_write,
.url_close = gopher_close,
.priv_data_size = sizeof(GopherContext),
.flags = URL_PROTOCOL_FLAG_NETWORK,
.default_whitelist = "gopher,gophers,tcp,tls"
};
#endif /* CONFIG_GOPHERS_PROTOCOL */

View File

@ -34,6 +34,7 @@ extern const URLProtocol ff_ffrtmphttp_protocol;
extern const URLProtocol ff_file_protocol; extern const URLProtocol ff_file_protocol;
extern const URLProtocol ff_ftp_protocol; extern const URLProtocol ff_ftp_protocol;
extern const URLProtocol ff_gopher_protocol; extern const URLProtocol ff_gopher_protocol;
extern const URLProtocol ff_gophers_protocol;
extern const URLProtocol ff_hls_protocol; extern const URLProtocol ff_hls_protocol;
extern const URLProtocol ff_http_protocol; extern const URLProtocol ff_http_protocol;
extern const URLProtocol ff_httpproxy_protocol; extern const URLProtocol ff_httpproxy_protocol;

View File

@ -32,7 +32,7 @@
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
// Also please add any ticket numbers that you believe might be affected here // Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MAJOR 58
#define LIBAVFORMAT_VERSION_MINOR 72 #define LIBAVFORMAT_VERSION_MINOR 73
#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \