/*
  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 */
