Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
KCGI(3)			    Library Functions Manual		       KCGI(3)

NAME
       kcgi -- minimal CGI and FastCGI library in C

LIBRARY
       library "libkcgi"

SYNOPSIS
       #include	<sys/types.h>
       #include	<stdarg.h>
       #include	<stdint.h>
       #include	<kcgi.h>
       #define KCGI_VMAJOR x
       #define KCGI_VMINOR y
       #define KCGI_VBUILD z
       #define KCGI_VERSION x.y.z
       #define KCGI_VSTAMP xxxyyyzzz

DESCRIPTION
       The  kcgi  library handles the CGI or FastCGI environment for C web ap-
       plications.  Interfacing	applications generally work as follows:

       1.   Call khttp_parse(3)	as early as possible.	This  will  parse  and
	    validate input fields and cookies with the kvalid_string(3)	family
	    of	functions  or  those  provided by the calling application.  It
	    will do so in memory, so enormous requests (e.g., files) will  oc-
	    cur	 entirely  in  memory!	 It also sets up the HTTP environment:
	    compression, paths,	MIME types, and	so on.

       2.   Process input fields by examining the struct kpair elements.

       3.   Emit HTTP headers with khttp_head(3), followed by khttp_body(3) to
	    begin the HTTP body.

       4.   Emit HTTP body output using	the khttp_template(3) templating  sys-
	    tem, the khttp_write(3) family for general HTTP content, and/or an
	    external  library  such  as	 kcgihtml(3).  Do not use printf(3) or
	    other functions to append to standard output: kcgi will  automati-
	    cally  compress  output if requested by the	client,	and overriding
	    the	output stream will circumvent this  behaviour  and  might  mix
	    compressed and uncompressed	data.

       5.   Call khttp_free(3) to clean	up.

       It  can	also  accept  FastCGI  connections  in a manner	similar	to the
       above, except that the parse routine is run within a loop.

       1.   Call khttp_fcgi_init(3) as early as	possible.

       2.   Iterate over khttp_fcgi_parse(3) for as many  connections  as  de-
	    sired,  performing	any  processing	 on the	created	request.  Each
	    successful parse must be matched with khttp_free(3).

       3.   Call khttp_fcgi_free(3) when all processing	is complete.

       To compile applications with kcgi, include the kcgi.h as	follows:

	     #include <sys/types.h> /* size_t, ssize_t */
	     #include <stdarg.h> /* va_list */
	     #include <stdint.h> /* int64_t */
	     #include <kcgi.h>

       To compile and link, use	pkg-config(1):

	     % cc `pkg-config --cflags kcgi` -c	-o sample.o sample.c
	     % cc -o sample sample.o `pkg-config --libs	kcgi`

       If the library will be statically linked	(e.g., for  running  within  a
       chroot(2)), link	as follows:

	     % cc `pkg-config --static --cflags	kcgi` -c -o sample.o sample.c
	     % cc -static -o sample sample.o `pkg-config --static --libs kcgi`

       The  current  version  of  the  library is defined in KCGI_VERSION as a
       string of major number, minor number,  and  build.   These  values  are
       available  seperately as	KCGI_VMAJOR, KCGI_VMINOR, and KCGI_VBUILD, re-
       spectively.  A numeric concatenation  of	 the  version  is  defined  as
       KCGI_VSTAMP,  which  may	be used	to test	for version number applicabil-
       ity.

   Pledge Promises
       The kcgi	library	is built to  operate  in  security-sensitive  environ-
       ments,  including pledge(2) on OpenBSD.	The following is a list	of all
       required	promises.

       cpath wpath
	       kutil_openlog(3)	requires file-system  access  to  produce  its
	       log.

       proc    khttp_parse(3)	and   khttp_fcgi_init(3)   must	 create	 child
	       processes.

       stdio   Required	by essentially all kcgi	functions.

       rpath   khttp_template(3) and khttp_templatex(3)	need access  to	 their
	       template	files.

       recvfd  khttp_fcgi_init(3)  needs  these	 for  inheritence by its child
	       processes and khttp_fcgi_parse(3) needs this for	accepting  the
	       end-point descriptor for	each connection.

       unix sendfd
	       khttp_fcgi_init(3)  needs  these	 for  inheritence by its child
	       processes.

EXAMPLES
       The following simple example assumes that kcgi.h	is in  the  compiler's
       include	path.  None of them perform error checking: each call into the
       kcgi library should have	its error code checked!

       The following does nothing but emit "Hello, world!" to the output.

	     #include <sys/types.h> /* size_t, ssize_t */
	     #include <stdarg.h> /* va_list */
	     #include <stddef.h> /* NULL */
	     #include <stdint.h> /* int64_t */
	     #include <kcgi.h>

	     int main(void) {
	       struct kreq r;
	       const char *page	= "index";

	       if (khttp_parse(&r, NULL, 0, &page, 1, 0) != KCGI_OK)
		   return 1;

	       khttp_head(&r, kresps[KRESP_STATUS],
		   "%s", khttps[KHTTP_200]);
	       khttp_head(&r, kresps[KRESP_CONTENT_TYPE],
		   "%s", kmimetypes[r.mime]);
	       khttp_body(&r);
	       khttp_puts(&r, "Hello, world!");

	       khttp_free(&r);
	       return 0;
	     }

       This can	be extended to work with the FastCGI interface by allowing the
       request parser to operate within	a loop.

	     #include <sys/types.h> /* size_t, ssize_t */
	     #include <stdarg.h> /* va_list */
	     #include <stddef.h> /* NULL */
	     #include <stdint.h> /* int64_t */
	     #include <kcgi.h>

	     int main(void) {
	       struct kreq r;
	       struct kfcgi *fcgi;
	       const char *page	= "index";

	       if (khttp_fcgi_init(&fcgi, NULL,	0, &page, 1, 0)	!= KCGI_OK)
		   return 1;

	       while (khttp_fcgi_parse(fcgi, &r) == KCGI_OK) {
		 khttp_head(&r,	kresps[KRESP_STATUS],
		     "%s", khttps[KHTTP_200]);
		 khttp_head(&r,	kresps[KRESP_CONTENT_TYPE],
		     "%s", kmimetypes[r.mime]);
		 khttp_body(&r);
		 khttp_puts(&r,	"Hello,	world!");
		 khttp_free(&r);
	       }

	       khttp_fcgi_free(fcgi);
	       return 0;
	     }

       In a more complicated example, kcgi accepts a single parameter "string"
       to validate and display.	 This might be provided	as  part  of  an  HTML
       form or directly	as part	of the URL query string.

	     #include <sys/types.h> /* size_t, ssize_t */
	     #include <stdarg.h> /* va_list */
	     #include <stdint.h> /* int64_t */
	     #include <kcgi.h>

	     int main(void) {
	       struct kreq r;
	       struct kpair *p;
	       const char *page	= "index";
	       struct kvalid key = { kvalid_stringne, "string" };

	       if (khttp_parse(&r, &key, 1, &page, 1, 0) != KCGI_OK)
		   return 1;

	       khttp_head(&r, kresps[KRESP_STATUS],
		   "%s", khttps[KHTTP_200]);
	       khttp_head(&r, kresps[KRESP_CONTENT_TYPE],
		   "%s", kmimetypes[r.mime]);
	       khttp_body(&r);
	       khttp_puts(&r, "Result: ");
	       if ((p =	r.fieldmap[0]))
		   khttp_puts(&r, p->parsed.s);
	       else if (r.fieldnmap[0])
		   khttp_puts(&r, "bad parse");
	       else
		   khttp_puts(&r, "no value");

	       khttp_free(&r);
	       return 0;
	     }

       Applications  will usually specify an array of key-value	pairs to vali-
       date; or	in the event of	 web  services,	 a  default  validator	(empty
       string) for the full HTTP message body.

SEE ALSO
       kcgi_buf_printf(3),	   kcgi_buf_putc(3),	     kcgi_buf_puts(3),
       kcgi_buf_write(3),      kcgi_strerror(3),       kcgi_writer_disable(3),
       kcgi_writer_free(3),	 kcgi_writer_get(3),	  kcgi_writer_putc(3),
       kcgi_writer_puts(3),  kcgi_writer_write(3),  kcgihtml(3),  kcgijson(3),
       kcgiregress(3),	  kcgixml(3),	 khttp_body(3),	   khttp_epoch2str(3),
       khttp_fcgi_free(3),	khttp_fcgi_getfd(3),	   khttp_fcgi_init(3),
       khttp_fcgi_parse(3),  khttp_fcgi_test(3), khttp_free(3),	khttp_head(3),
       khttp_parse(3),	  khttp_printf(3),    khttp_putc(3),	khttp_puts(3),
       khttp_template(3),	 khttp_templatex(3),	   khttp_urlencode(3),
       khttp_write(3),	  khttpbasic_validate(3),     khttpdigest_validate(3),
       kmalloc(3),    kutil_invalidate(3),   kutil_log(3),   kutil_openlog(3),
       kvalid_string(3), kfcgi(8)

STANDARDS
       Many standards are involved in the kcgi library,	most significantly be-
       ing draft RFC 3875, "The	Common Gateway Interface (CGI)	Version	 1.1",
       and the "FastCGI	Specification",	version	1.0, published 29 April	1996.

          Cookies  are	parsed according to "HTTP State	Management Mechanism",
	   RFC 6265.  However, quoted cookies are not supported.

          The "Authentication"	header is parsed for digest or basic tokens as
	   defined by RFC 2617,	"HTTP Authentication: Basic and	Digest	Access
	   Authentication",   and  RFC	6750,  "The  OAuth  2.0	 Authorization
	   Framework: Bearer Token Usage".

          The partial multipart form data support is  defined	by  RFC	 2388,
	   "Returning  Values  from Forms: multipart/form-data", which is fur-
	   ther	defined	by RFCs	2045 and  2046,	 "Multipurpose	Internet  Mail
	   Extensions".

          MIME	type names are registered with IANA.

          URLs	 are  formatted	 according  to	RFC  1630, "Universal Resource
	   Identifiers in WWW".

          HTTP	response headers are standardised in RFC 2616, "HTTP/1.1"  and
	   further in RFC 4229,	"HTTP Header Field Registrations".

          Permanent URI schemes are registered	with IANA.

          The	    FastCGI	Extensions     for     Management     Control:
	   https://kristaps.bsd.lv/kcgi/extending01.html.

          HTTP	dates (logging and date-time management) are specified by "RFC
	   822".

          URL encoding	and decoding is	defined	by RFC 3986, "Uniform Resource
	   Identifier (URI): Generic Syntax".

       Additional HTTP methods are defined by RFC 4918,	"HTTP  Extensions  for
       Web  Distributed	Authoring and Versioning"; and RFC 4791	, "Calendaring
       Extensions to WebDAV".

AUTHORS
       The kcgi	library	was written by Kristaps	Dzonsons <kristaps@bsd.lv>.

FreeBSD	Ports 14.quarterly	  $Mdocdate$			       KCGI(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=kcgi&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help