/*******************************************************************************/
/* */
/* Copyright 2005 Pascal Gloor <pascal.gloor@spale.com> */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* */
/*******************************************************************************/
#include <inttypes.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define CGI_MAX_VARS 1024
#define CGI_GET_ONLY 0x01
#define CGI_POST_ONLY 0x02
/* struct for each GET/POST variable */
struct CGIVar {
char *name; /* field name */
char *filename; /* filename in case of file upload */
char *ctype; /* content type */
char *value; /* data */
size_t value_len; /* data lenght */
};
/* http request context */
struct CGIContext {
int cur_var; /* current var for CGI_NextVar() */
int var_num; /* number of vars */
size_t max_len; /* maximum lenght of data */
char *ctype; /* content-type */
char *boundary; /* multipart boundary */
char *buffer; /* stdin buffer */
char *qs; /* query string buffer */
char *ct; /* content-type buffer */
struct sockaddr_in peer; /* remote addr */
struct CGIVar *var[CGI_MAX_VARS]; /* vars */
};
struct CGIGetResult {
char *value;
size_t value_len;
};
typedef struct CGIContext CGI_CTX;
typedef struct CGIVar CGI_VAR;
typedef struct CGIGetResult CGI_GET_RES;
extern CGI_CTX *CGI_Init (void);
extern int CGI_Parse (CGI_CTX*, const int, size_t);
extern CGI_VAR *CGI_FindVar (CGI_CTX*, char*);
extern void CGI_FirstVar (CGI_CTX*);
extern CGI_VAR *CGI_NextVar (CGI_CTX*);
extern struct sockaddr_in *CGI_Peer (CGI_CTX*);
extern void CGI_End (CGI_CTX*);