/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
*/
#include "mymalloc/mymalloc.h"
/*------------------------------------------------------------------------*/
/* http-writemsg.c - generic HTTP-Message functions: */
/* Creating and sending of HTTP-Messages. */
/*------------------------------------------------------------------------*/
/* Comments: */
/* - Status: */
/* - To check: All Buffers free()ed? Also in error cases? */
/*------------------------------------------------------------------------*/
/*
* RCS:
* $RCSfile: http-writemsg.c,v $ $Revision: 1.3 $ $State: Exp $
* $Locker: $
*/
#include "defs.h"
#include "protos.h"
#include "types.h"
#include "server.h"
#include "http-defs.h"
#include "http.h"
extern struct HTTPError HTTPErrorTable[];
/****** http-writemsg/AddField ***********************************************
*
* NAME
*
*
* SYNOPSIS
*
*
* FUNCTION
*
*
* INPUTS
*
*
* RESULT
*
*
* NOTES
*
*
* BUGS
*
*
* SEE ALSO
*
*
******************************************************************************
*
*/
rc_t AddField( struct MsgHeader *Ptr, int Field, char *Content )
{
struct MsgHeader *NewHeader;
if( Ptr != NULL )
while( Ptr->Next != NULL )
Ptr = Ptr->Next;
NewHeader = AppendMsgHeader( Ptr, Field, Content );
if( NewHeader != NULL )
return( OK );
else
return( WARN );
}
/****** http-writemsg/CreateStatusLine ***************************************
*
* NAME
*
*
* SYNOPSIS
*
*
* FUNCTION
*
*
* INPUTS
*
*
* RESULT
*
*
* NOTES
*
*
* BUGS
*
*
* SEE ALSO
*
*
******************************************************************************
*
*/
rc_t CreateStatusLine( char *Buffer, size_t *BuffSize, int Code, int Protocol )
{
int Entry;
Entry = GetHTTPErrorTableEntry( Code );
switch( Protocol )
{
case HTTP_1_0:
{
if( Entry != 0 )
SNPrintf( Buffer, BuffSize, "HTTP/1.0 %d %s\r\n", Code, HTTPErrorTable[Entry].Reason );
else
SNPrintf( Buffer, BuffSize, "HTTP/1.0 %d Statuscode %d\r\n", Code, Code );
return( OK );
}
break;
case HTTP_1_1:
{
if( Entry != 0 )
SNPrintf( Buffer, BuffSize, "HTTP/1.1 %d %s\r\n", Code, HTTPErrorTable[Entry].Reason );
else
SNPrintf( Buffer, BuffSize, "HTTP/1.1 %d Statuscode %d\r\n", Code, Code );
return( OK );
}
break;
default:
{
return( ERROR );
}
}
}
/****** http-writemsg/CreateHTTPMsg ******************************************
*
* NAME
*
*
* SYNOPSIS
*
*
* FUNCTION
*
*
* INPUTS
*
*
* RESULT
*
*
* NOTES
*
*
* BUGS
*
*
* SEE ALSO
*
*
******************************************************************************
*
*/
struct HTTPMsg *CreateHTTPMsg( char *Header, char *Body, size_t BodySize )
{
struct HTTPMsg *Msg;
/* printf( "### CreateHTTPMsg(+)\n" ); */
Msg = (struct HTTPMsg*)mymalloc( sizeof( struct HTTPMsg ) );
if( Msg != NULL )
{
/* printf( "### Header[%d]:\n%s", strlen( Header ), Header ); */
/* printf( "### Body[%d]:\n", BodySize ); */
Msg->Body = Body;
Msg->BodySize = BodySize;
if( ( Msg->Head = (char*)mymalloc( strlen( Header ) + 1 ) ) != NULL )
strcpy( Msg->Head, Header );
else
{
free( Msg );
return( NULL );
}
/* printf( "### Done!\n" ); */
}
/* printf( "### CreateHTTPMsg(-)\n" ); */
return( Msg );
}
/****** http-writemsg/SendHTTPMsg ********************************************
*
* NAME
*
*
* SYNOPSIS
*
*
* FUNCTION
*
*
* INPUTS
*
*
* RESULT
*
*
* NOTES
*
*
* BUGS
*
*
* SEE ALSO
*
*
******************************************************************************
*
*/
rc_t SendHTTPMsg( int SockFD, struct HTTPMsg *Msg )
{
size_t Check;
if( ( Msg != NULL ) && ( Msg->Head != NULL ) )
{
Check = WriteN( SockFD, Msg->Head, strlen(Msg->Head) );
if( Check < 0 )
ErrorMsg( E_SYS, ERROR, "ERROR: WriteN(): write() failed." );
else if( Check != strlen(Msg->Head) )
LogMsg( LG_SERVER, WARN,
"WARN: SendHTTPMsg(): %d of %d Bytes of Header written!",
Check, strlen(Msg->Head) );
if( ( Msg->Body != NULL ) && ( Msg->BodySize > 0 ) )
{
Check = WriteN( SockFD, Msg->Body, Msg->BodySize );
if( Check < 0 )
ErrorMsg( E_SYS, ERROR, "ERROR: WriteN(): write() failed." );
else if( Check != Msg->BodySize )
LogMsg( LG_SERVER, WARN,
"WARN: SendHTTPMsg(): %d of %d Bytes of Body written!",
Check, Msg->BodySize );
}
return( OK );
}
else
{
return( ERROR );
}
}
/****** http-writemsg/FreeHTTPMsg ********************************************
*
* NAME
*
*
* SYNOPSIS
*
*
* FUNCTION
*
*
* INPUTS
*
*
* RESULT
*
*
* NOTES
*
*
* BUGS
*
*
* SEE ALSO
*
*
******************************************************************************
*
*/
rc_t FreeHTTPMsg( struct HTTPMsg *Ptr )
{
free( Ptr->Head );
free( Ptr );
return( OK );
}