mirror of
https://github.com/matrix-construct/construct
synced 2024-12-26 15:33:54 +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/upload.cc \
|
||||
media/thumbnail.cc \
|
||||
media/preview_url.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