// Copyright (c) 1999-2001 David Muse
// See the COPYING file for more information

#ifndef HTTP_H
#define HTTP_H

#include <inputoutput.h>

// The http class provides functions for generating http headers.

// http 1.1

class   http : public inputoutput {
        public:

                        http(void *apistruct);

                // the following enumeration types codes
                // for use in the functions below and cause the function
                // to send the corresponding code

                // enums
                typedef enum {
                        // success codes
                        ok,
                        created,
                        accepted,
                        partialinformation,
                        noresponse,
                        // error codes
                        badrequest,
                        unauthorized,
                        paymentrequired,
                        forbidden,
                        notfound,
                        internalerror,
                        notimplemented,
                        servicetemporarilyoverloaded,
                        gatewaytimeout,
                        // redirection codes
                        moved,
                        found,
                        method,
                        notmodified
                } statuscode;
                
                typedef enum {
                        get_request,
                        head_request,
                        post_request
                } requestmethod;
                
                typedef enum {
                        xgzip,
                        xcompress
                } encodingmethod;

                // The following functions are convenience functions for
                // sending http headers.  The name of the function is the
                // header that is sent and the arguments are for the
                // possible fields of the header.  A null or empty character
                // string will leave that field blank.
                
                // status line
                void    status(strstream *container,
                                char *serverprotocol, statuscode code);
                void    status(strstream *container,
                                char *protocol, char *protocolversion,
                                statuscode code);

                // general header fields
                void    date(strstream *container, char *httpdate);
                void    pragma(strstream *container, char *pragmadirective);
                void    pragma(strstream *container, char *token, char *word);

                // entity header fields
                void    allow(strstream *container, requestmethod method, ...);
                void    contentEncoding(strstream *container,
                                        encodingmethod method);
                void    contentLength(strstream *container, int length);
                void    contentType(strstream *container,
                                        char *mimetype, char *mimesubtype, 
                                        char *charset);
                void    multiPartContentType(strstream *container,
                                        char *subtype, char *charset, 
                                        char *boundary);
                void    expires(strstream *container,
                                        char *httpdate);
                void    lastModified(strstream *container,
                                        char *httpdate);
                

                // response header fields
                void    location(strstream *container, char *url);
                void    location(strstream *container, char *path, char *page);
                void    location(strstream *container,
                                char *protocol, char *host, char *port,
                                char *url);
                void    location(strstream *container,
                                char *protocol, char *host, char *port,
                                char *path, char *page);
                void    server(strstream *container,
                                char *product, char *version);
                void    wwwAuthenticate(strstream *container,
                                char *challenge, ...);
                void    setCookie(strstream *container,
                                char *name, char *value, char *path,
                                char *domain, char *expires, int secure);

                // request header fields
                void    authorization(strstream *container, char *credentials);
                void    from(strstream *container, char *mailbox);
                void    ifModifiedSince(strstream *container, char *httpdate);
                void    referer(strstream *container,
                                char *protocol, char *host, char *port,
                                char *path);
                void    userAgent(strstream *container,
                                char *product, char *version);


        private:
                #include <private/http.h>

};

#endif