/* This file is part of libmicrohttpd Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff 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 */ /** * @file lib/response_from_buffer.c * @brief implementation of MHD_response_from_buffer() * @author Christian Grothoff */ #include "internal.h" /** * Create a response object. The response object can be extended with * header information and then be used any number of times. * * @param sc status code to use for the response; * #MHD_HTTP_NO_CONTENT is only valid if @a size is 0; * @param size size of the data portion of the response * @param buffer size bytes containing the response's data portion * @param mode flags for buffer management * @return NULL on error (i.e. invalid arguments, out of memory) * @ingroup response */ struct MHD_Response * MHD_response_from_buffer (enum MHD_HTTP_StatusCode sc, size_t size, void *buffer, enum MHD_ResponseMemoryMode mode) { struct MHD_Response *response; void *tmp; mhd_assert ( (NULL != buffer) || (0 == size) ); if (NULL == (response = MHD_calloc_ (1, sizeof (struct MHD_Response)))) return NULL; response->fd = -1; if (! MHD_mutex_init_ (&response->mutex)) { free (response); return NULL; } if ( (MHD_RESPMEM_MUST_COPY == mode) && (size > 0) ) { if (NULL == (tmp = malloc (size))) { MHD_mutex_destroy_chk_ (&response->mutex); free (response); return NULL; } memcpy (tmp, buffer, size); buffer = tmp; } if (MHD_RESPMEM_PERSISTENT != mode) { response->crfc = &free; response->crc_cls = buffer; } response->status_code = sc; response->reference_count = 1; response->total_size = size; response->data = buffer; response->data_size = size; return response; } /* end of response_from_buffer.c */