aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/gopher.c
diff options
context:
space:
mode:
authorparazyd <parazyd@dyne.org>2021-02-28 23:47:05 +0100
committerMarton Balint <cus@passwd.hu>2021-03-11 23:47:19 +0100
commit51367267c8a9f1a840f5e810f8c788e6e03712a5 (patch)
treec8129640c2a34829b10bc34e9315757e8d81b6dc /libavformat/gopher.c
parented4c2e183bc61414abb421b2bf19ac44e436da06 (diff)
downloadffmpeg-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.c30
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 */