/* This file is part of libhttpserver Copyright (C) 2011-2025 Sebastiano Merlino This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ // binary_buffer_response.cpp - serve binary data (e.g., images) directly // from an in-memory buffer. std::string holds arbitrary bytes, including // null characters, making it suitable for any binary content. // // To test: // curl -o output.png http://localhost:8080/image #include #include // Generate a minimal valid 1x1 red PNG image in memory. // In a real application, this could come from a camera capture, image // processing library, database blob, etc. static std::string generate_png_data() { // Minimal 1x1 red pixel PNG (68 bytes) static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, // PNG signature 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, // IHDR chunk 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, // 1x1 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, // 8-bit RGB 0xde, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, // IDAT chunk 0x54, 0x08, 0xd7, 0x63, 0xf8, 0xcf, 0xc0, 0x00, // compressed data 0x00, 0x00, 0x03, 0x00, 0x01, 0x36, 0x28, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, // IEND chunk 0x44, 0xae, 0x42, 0x60, 0x82 }; return std::string(reinterpret_cast(png), sizeof(png)); } int main() { httpserver::webserver ws{httpserver::create_webserver(8080)}; ws.on_get("/image", [](const httpserver::http_request&) { // The response sends the exact bytes in the string — the size is // tracked internally, so null bytes and non-printable characters // are transmitted correctly. return httpserver::http_response::string(generate_png_data(), "image/png"); }); ws.start(true); return 0; }