/* Jon Arney, (c) 2000 */

/* This file is distributed under the GPL, see file COPYING for details */

#ifndef _HTTP_CORE_H_
#define _HTTP_CORE_H_

/* This is a representation of an HTTP request. */
typedef struct http_request_st {
  char *method;
  char *version;
  char *url_file;
  int sock;
  Gnut_List *rq_headers;
  Gnut_List *response_headers;
} http_request_t;

typedef struct http_cookie_st {
  char *value;
  char *path;
  char *domain; /* Unused */
  time_t expiration; /*Unused */
} http_cookie_t;

#define HTTP_MAX_HEADER_SIZE 64

#ifdef __cplusplus
extern "C" {
#endif

  void free_hrt(http_request_t **x, int bugnum);

  /* Allocate a new request object which talks on socket 'socket'. */
  http_request_t *http_request_new(int socket);

  /* Delete memory associated with request_delete. */
  void http_request_delete(http_request_t *req);

  /* Parse a new HTTP request from a request line. */
  int http_request_parse(http_request_t *req, char *request);

  /* Read a header from the input source. */
  int http_request_read_header(http_request_t *req);

  /* Examine the HTTP headers and find one of the values. */
  char *http_request_find_header(http_request_t *req, char *name);

  /* Write a raw string to the output source. */
  int http_write_str(http_request_t *req, char *a);
  int http_write_va(http_request_t *req, int maxlen, char *format, ...);

  /* Add a header to the response of this request. */
  int http_response_header_add(http_request_t *req, char *name, char *value);
  int http_response_header_add_va(http_request_t *req, char *name,
				  char *fmt, ...);

  /* Set a cookie. */
  http_cookie_t *http_cookie_new(void);
  void http_cookie_delete(http_cookie_t *cookp);
  int http_response_set_cookie(http_request_t *req, http_cookie_t *cookp);
  int http_header_get_cookie(http_request_t *req, http_cookie_t *cookp);

  /* Write the HTTP response haders from the response to this request. */
  int http_response_header_write(http_request_t *req);

#ifdef __cplusplus
}
#endif

#endif /*_HTTP_CORE_H_*/
