headermap.h   [plain text]


/*
 * Copyright (c) 2000-2002,2004 Apple Computer, Inc. All Rights Reserved.
 * 
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */


//
// headermap - represent Internet-standard headers
//
//@@@ Handle duplicate entries.
//@@@ Be flexible: think HTTP (append with commas) vs. RFC822 (multiple Received: headers etc.)
//
#ifndef _H_HEADERMAP
#define _H_HEADERMAP

#include <string>
#include <map>


namespace Security {


//
// Header-maps
//
class HeaderMap {
    static const int maxKeyLength = 80;
    typedef std::map<std::string, std::string> Map;
public:
    HeaderMap() { }
    virtual ~HeaderMap() { }
    
    virtual void merge(std::string key, std::string &old, std::string newValue);
    
    void add(const char *key, const char *value);
    void add(const char *line);		// Key: value
    void remove(const char *key);

    const char *find(const char *key, const char *def = NULL) const;
    std::string &operator [] (const char *key);
    
    typedef Map::const_iterator ConstIterator;
    ConstIterator begin() const	{ return mMap.begin(); }
    ConstIterator end() const	{ return mMap.end(); }
    
    typedef Map::const_iterator Iterator;
    Iterator begin()			{ return mMap.begin(); }
    Iterator end()				{ return mMap.end(); }    
    
    std::string collect(const char *lineEnding = "\r\n") const;
    size_t collectLength(const char *lineEnding = "\r\n") const;
    
private:
    //
    // In-place case canonicalization of header keys
    //
    struct CanonicalKey {
        CanonicalKey(const char *key, char end = '\0');
        operator const char *() const { return mValue; }
        operator std::string () const { return mValue; }
    private:
        char mValue[maxKeyLength];
    };
    
    void add(const CanonicalKey &key, const char *value);

private:
    Map mMap;						// map of key: value pairs
};


}	// end namespace Security


#endif /* _H_HEADERMAP */