From 6aa3b40faa0de728739d700be24730e9312fb070 Mon Sep 17 00:00:00 2001 From: tastytea Date: Sat, 11 Jun 2022 05:15:22 +0200 Subject: [PATCH] Read images from file, allow forcing magick --- src/image.cpp | 34 +++++++++++++++++++++++----------- src/image.hpp | 10 +++++++++- src/main.cpp | 10 +++++++++- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/image.cpp b/src/image.cpp index e83e050..e8d3d34 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -20,26 +20,23 @@ #include #include +#include #include #include #include #include #include +#include +#include namespace libravatarserv::image { -void write(Magick::Image &img) { - string magick{img.magick()}; - std::transform(magick.begin(), magick.end(), magick.begin(), ::tolower); - - Magick::Blob buffer; - img.write(&buffer); - - std::cout << "Content-Type: image/" << magick << '\n'; - std::cout << "Content-Length: " << buffer.length() << "\n\n"; - std::cout.write(static_cast(buffer.data()), - static_cast(buffer.length())); +Magick::Image get(const fs::path &filepath, const size_t size) { + Magick::Image img; + img.read(filepath); + img.resize(Magick::Geometry(size, size)); + return img; } Magick::Image generate_identicon(const request_t &req) { @@ -70,4 +67,19 @@ Magick::Image generate_identicon(const request_t &req) { return img; } +void write(Magick::Image &img, + const std::optional magick_force) { + std::string magick{magick_force.value_or(img.magick())}; + std::transform(magick.begin(), magick.end(), magick.begin(), ::tolower); + img.magick(magick); + + Magick::Blob buffer; + img.write(&buffer); + + std::cout << "Content-Type: image/" << magick << '\n'; + std::cout << "Content-Length: " << buffer.length() << "\n\n"; + std::cout.write(static_cast(buffer.data()), + static_cast(buffer.length())); +} + } // namespace libravatarserv::image diff --git a/src/image.hpp b/src/image.hpp index cc89b9e..27bb54a 100644 --- a/src/image.hpp +++ b/src/image.hpp @@ -17,17 +17,25 @@ #ifndef LIBRAVATARSERV_IMAGE_HPP #define LIBRAVATARSERV_IMAGE_HPP +#include "fs-compat.hpp" #include "types.hpp" #include +#include + namespace libravatarserv::image { -void write(Magick::Image &img); +// read image from file +[[nodiscard]] Magick::Image get(const fs::path &filepath, size_t size); // Generate identicon from hash [[nodiscard]] Magick::Image generate_identicon(const request_t &req); +// write image with headers to stdout +void write(Magick::Image &img, + std::optional magick_force = nullptr); + } // namespace libravatarserv::image #endif // LIBRAVATARSERV_IMAGE_HPP diff --git a/src/main.cpp b/src/main.cpp index ea8730e..812a643 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ #include "request.hpp" #include "version.hpp" +#include #include #include @@ -49,7 +50,14 @@ int main(int /*argc*/, char * /*argv*/[]) { Magick::Image img; if (!email.empty()) { - // img = image::get(cfg.avatar_dir / email, req.size); + try { + img = image::get(cfg.avatar_dir / email, + static_cast(req.size)); + } catch (const Magick::Exception &e) { + std::cout << "Status: 500 Internal Server Error\n\n"; + std::cerr << "ERROR: " << e.what() << '\n'; + return 1; + } } else { if (cfg.redirect) { std::cout << "Status: 307 Temporary Redirect\n";