diff options
author | parazyd <parazyd@dyne.org> | 2021-02-28 23:47:05 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2021-03-11 23:47:19 +0100 |
commit | 51367267c8a9f1a840f5e810f8c788e6e03712a5 (patch) | |
tree | c8129640c2a34829b10bc34e9315757e8d81b6dc /libavformat/gopher.c | |
parent | ed4c2e183bc61414abb421b2bf19ac44e436da06 (diff) | |
download | ffmpeg-51367267c8a9f1a840f5e810f8c788e6e03712a5.tar.gz |
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>
Diffstat (limited to 'libavformat/gopher.c')
-rw-r--r-- | libavformat/gopher.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/libavformat/gopher.c b/libavformat/gopher.c index 7c88ab01a8..9bbe171640 100644 --- a/libavformat/gopher.c +++ b/libavformat/gopher.c @@ -2,6 +2,7 @@ * Gopher protocol * * Copyright (c) 2009 Toshimitsu Kimura + * Copyright (c) 2021 parazyd <parazyd@dyne.org> * * 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 */ +#include "config.h" + #include "libavutil/avstring.h" #include "avformat.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) { 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; + const char *lower_proto = "tcp"; h->is_streamed = 1; /* needed in any case to build the host string */ - av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, - path, sizeof(path), uri); + av_url_split(proto, sizeof(proto), auth, sizeof(auth), + hostname, sizeof(hostname), &port, path, sizeof(path), uri); if (port < 0) 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; 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; } +#if CONFIG_GOPHER_PROTOCOL const URLProtocol ff_gopher_protocol = { .name = "gopher", .url_open = gopher_open, @@ -120,3 +128,17 @@ const URLProtocol ff_gopher_protocol = { .flags = URL_PROTOCOL_FLAG_NETWORK, .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 */ |