0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-18 07:50:57 +01:00
construct/modules/media/upload.cc

122 lines
2.2 KiB
C++
Raw Normal View History

2018-02-04 03:22:01 +01:00
// 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.
2017-12-25 01:15:42 +01:00
#include "media.h"
2017-12-25 01:15:42 +01:00
using namespace ircd;
m::resource
2017-12-25 01:15:42 +01:00
upload_resource
{
"/_matrix/media/r0/upload/",
2017-12-25 01:15:42 +01:00
{
"(11.7.1.1) upload",
2017-12-25 01:15:42 +01:00
}
};
m::resource::response
post__upload(client &client,
const m::resource::request &request)
2017-12-25 01:15:42 +01:00
{
const auto &content_type
{
request.head.content_type
};
const auto &server
2017-12-25 01:15:42 +01:00
{
my_host()
2017-12-25 01:15:42 +01:00
};
const auto &filename
2017-12-25 01:15:42 +01:00
{
request.query["filename"]
2017-12-25 01:15:42 +01:00
};
char randbuf[32];
const auto randstr
2017-12-25 01:15:42 +01:00
{
rand::string(randbuf, rand::dict::alpha)
};
2017-12-25 01:15:42 +01:00
const m::media::mxc mxc
{
server, randstr
};
const m::room::id::buf room_id
2017-12-25 01:15:42 +01:00
{
m::media::file::room_id(mxc)
};
m::vm::copts vmopts;
const m::room room
{
room_id, &vmopts
};
create(room, request.user_id, "file");
const unique_buffer<mutable_buffer> buf
{
request.head.content_length
};
copy(buf, request.content);
client.content_consumed += read_all(*client.sock, buf + client.content_consumed);
assert(client.content_consumed == request.head.content_length);
const size_t written
{
m::media::file::write(room, request.user_id, buf, content_type, filename)
};
char uribuf[256];
const string_view content_uri
{
mxc.uri(uribuf)
2017-12-25 01:15:42 +01:00
};
log::debug
{
m::media::log, "%s uploaded %zu bytes uri: `%s' file_room %s :%s",
request.user_id,
request.head.content_length,
content_uri,
string_view{room.room_id},
filename,
};
return m::resource::response
2017-12-25 01:15:42 +01:00
{
client, http::CREATED, json::members
{
{ "content_uri", content_uri }
}
2017-12-25 01:15:42 +01:00
};
}
static const struct m::resource::method::opts
method_post_opts
2017-12-25 01:15:42 +01:00
{
m::resource::method::REQUIRES_AUTH |
m::resource::method::CONTENT_DISCRETION,
-1s, // TODO: no coarse timer
8_MiB //TODO: conf; (this is the payload max option)
};
static m::resource::method
method_post
{
upload_resource, "POST", post__upload, method_post_opts
};