|  | /** @file | 
|  |  | 
|  | A brief file description | 
|  |  | 
|  | @section license License | 
|  |  | 
|  | Licensed to the Apache Software Foundation (ASF) under one | 
|  | or more contributor license agreements.  See the NOTICE file | 
|  | distributed with this work for additional information | 
|  | regarding copyright ownership.  The ASF licenses this file | 
|  | to you 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. | 
|  | */ | 
|  |  | 
|  | /***************************************************************************** | 
|  | * | 
|  | *  ControlBase.h - Base class to process generic modifiers to | 
|  | *                         ControlMatcher Directives | 
|  | * | 
|  | * | 
|  | ****************************************************************************/ | 
|  |  | 
|  |  | 
|  | #ifndef _CONTROL_BASE_H_ | 
|  | #define _CONTROL_BASE_H_ | 
|  |  | 
|  | #include "libts.h" | 
|  |  | 
|  | class HttpRequestData; | 
|  | class Tokenizer; | 
|  | struct matcher_line; | 
|  |  | 
|  | class ControlBase | 
|  | { | 
|  | public: | 
|  | struct Modifier { | 
|  | enum Type { | 
|  | MOD_INVALID, | 
|  | MOD_PORT, | 
|  | MOD_SCHEME, | 
|  | MOD_PREFIX, | 
|  | MOD_SUFFIX, | 
|  | MOD_METHOD, | 
|  | MOD_TIME, | 
|  | MOD_SRC_IP, | 
|  | MOD_IPORT, | 
|  | MOD_TAG, | 
|  | }; | 
|  | /// Destructor - force virtual. | 
|  | virtual ~Modifier(); | 
|  | /// Return the modifier type. | 
|  | virtual Type type() const; | 
|  | /// Return the name for the modifier type. | 
|  | virtual char const *name() const = 0; | 
|  | /** Test if the modifier matches the request. | 
|  | @return @c true if the request is matched, @c false if not. | 
|  | */ | 
|  | virtual bool check(HttpRequestData *req ///< Request to check. | 
|  | ) const = 0; | 
|  | /// Print the mod information. | 
|  | virtual void print(FILE *f ///< Output stream. | 
|  | ) const = 0; | 
|  | }; | 
|  |  | 
|  | ControlBase(); | 
|  | ~ControlBase(); | 
|  | const char *ProcessModifiers(matcher_line *line_info); | 
|  | bool CheckModifiers(HttpRequestData *request_data); | 
|  | bool CheckForMatch(HttpRequestData *request_data, int last_number); | 
|  | void Print(); | 
|  | int line_num; | 
|  | Modifier *findModOfType(Modifier::Type t) const; | 
|  |  | 
|  | protected: | 
|  | /// Get the text for the Scheme modifier, if any. | 
|  | /// @return The text if present, 0 otherwise. | 
|  | /// @internal Ugly but it's the only place external access is needed. | 
|  | char const *getSchemeModText() const; | 
|  |  | 
|  | private: | 
|  | typedef Vec<Modifier *> Array; | 
|  | Array _mods; | 
|  | const char *ProcessSrcIp(char *val, void **opaque_ptr); | 
|  | const char *ProcessTimeOfDay(char *val, void **opaque_ptr); | 
|  | const char *ProcessPort(char *val, void **opaque_ptr); | 
|  |  | 
|  | // Reset to default constructed state, free all allocations. | 
|  | void clear(); | 
|  | }; | 
|  |  | 
|  | inline ControlBase::ControlBase() : line_num(0) | 
|  | { | 
|  | } | 
|  |  | 
|  | inline bool | 
|  | ControlBase::CheckForMatch(HttpRequestData *request_data, int last_number) | 
|  | { | 
|  | return (last_number < 0 || last_number > this->line_num) && this->CheckModifiers(request_data); | 
|  | } | 
|  |  | 
|  | #endif |