mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 16:04:15 +01:00
modules/media: Add preview_url stub-plus.
This commit is contained in:
parent
3b57971f54
commit
bfba0ada0c
2 changed files with 164 additions and 0 deletions
|
@ -283,6 +283,7 @@ media_media_media_la_SOURCES = \
|
||||||
media/download.cc \
|
media/download.cc \
|
||||||
media/upload.cc \
|
media/upload.cc \
|
||||||
media/thumbnail.cc \
|
media/thumbnail.cc \
|
||||||
|
media/preview_url.cc \
|
||||||
media/media.cc \
|
media/media.cc \
|
||||||
###
|
###
|
||||||
|
|
||||||
|
|
163
modules/media/preview_url.cc
Normal file
163
modules/media/preview_url.cc
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#include "media.h"
|
||||||
|
|
||||||
|
resource
|
||||||
|
preview_url_resource
|
||||||
|
{
|
||||||
|
"/_matrix/media/r0/preview_url",
|
||||||
|
{
|
||||||
|
"(11.7.1.5) Get information about a URL for a client"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static unique_buffer<mutable_buffer>
|
||||||
|
request_url(const string_view &urle);
|
||||||
|
|
||||||
|
static json::strung
|
||||||
|
parse_og(const string_view &content);
|
||||||
|
|
||||||
|
static resource::response
|
||||||
|
get__preview_url(client &client,
|
||||||
|
const resource::request &request)
|
||||||
|
{
|
||||||
|
const auto &url
|
||||||
|
{
|
||||||
|
request.query.at("url")
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto &ts
|
||||||
|
{
|
||||||
|
request.query.get("ts", milliseconds(-1))
|
||||||
|
};
|
||||||
|
|
||||||
|
const unique_buffer<mutable_buffer> content_buffer
|
||||||
|
{
|
||||||
|
//request_url(url)
|
||||||
|
};
|
||||||
|
|
||||||
|
const string_view content
|
||||||
|
{
|
||||||
|
content_buffer
|
||||||
|
};
|
||||||
|
|
||||||
|
const json::strung ogs
|
||||||
|
{
|
||||||
|
parse_og(content)
|
||||||
|
};
|
||||||
|
|
||||||
|
return resource::response
|
||||||
|
{
|
||||||
|
client, json::object{ogs}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static resource::method
|
||||||
|
method_get
|
||||||
|
{
|
||||||
|
preview_url_resource, "GET", get__preview_url
|
||||||
|
};
|
||||||
|
|
||||||
|
json::strung
|
||||||
|
parse_og(const string_view &content)
|
||||||
|
{
|
||||||
|
std::vector<json::member> og;
|
||||||
|
|
||||||
|
return
|
||||||
|
{
|
||||||
|
og.data(), og.data() + og.size()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_buffer<mutable_buffer>
|
||||||
|
request_url(const string_view &urle)
|
||||||
|
{
|
||||||
|
const unique_buffer<mutable_buffer> buf
|
||||||
|
{
|
||||||
|
24_KiB
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto url
|
||||||
|
{
|
||||||
|
url::decode(urle, buf)
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto &host
|
||||||
|
{
|
||||||
|
between(url, "://", "/") //TODO: grammar / rfc3986.h
|
||||||
|
};
|
||||||
|
|
||||||
|
const string_view &service
|
||||||
|
{
|
||||||
|
split(url, "://").first
|
||||||
|
};
|
||||||
|
|
||||||
|
const string_view &path
|
||||||
|
{
|
||||||
|
end(host), end(url)
|
||||||
|
};
|
||||||
|
|
||||||
|
if(empty(host) || empty(path))
|
||||||
|
throw m::error
|
||||||
|
{
|
||||||
|
http::BAD_REQUEST, "M_BAD_URL",
|
||||||
|
"Something was wrong with the supplied URL."
|
||||||
|
};
|
||||||
|
|
||||||
|
window_buffer wb
|
||||||
|
{
|
||||||
|
buf + size(url)
|
||||||
|
};
|
||||||
|
|
||||||
|
http::request
|
||||||
|
{
|
||||||
|
wb, host, "GET", path, 0, {},
|
||||||
|
{
|
||||||
|
{ "User-Agent", info::user_agent },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const const_buffer out_head
|
||||||
|
{
|
||||||
|
wb.completed()
|
||||||
|
};
|
||||||
|
|
||||||
|
const mutable_buffer in_head
|
||||||
|
{
|
||||||
|
buf + size(url) + size(out_head)
|
||||||
|
};
|
||||||
|
|
||||||
|
const net::hostport remote
|
||||||
|
{
|
||||||
|
//TODO: fix services translation in net::dns::
|
||||||
|
host, {}, service == "https"? uint16_t(443) : uint16_t(80)
|
||||||
|
};
|
||||||
|
|
||||||
|
server::request::opts sopts;
|
||||||
|
sopts.http_exceptions = false;
|
||||||
|
server::request request
|
||||||
|
{
|
||||||
|
remote, { out_head }, { in_head, mutable_buffer{} }, &sopts
|
||||||
|
};
|
||||||
|
|
||||||
|
request.wait(seconds(10)); //TODO: conf
|
||||||
|
|
||||||
|
const auto code
|
||||||
|
{
|
||||||
|
request.get()
|
||||||
|
};
|
||||||
|
|
||||||
|
if(code != http::OK)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
assert(data(request.in.content) == data(request.in.dynamic));
|
||||||
|
return std::move(request.in.dynamic);
|
||||||
|
}
|
Loading…
Reference in a new issue