Page Speed Optimization Libraries  1.5.27.2
net/instaweb/rewriter/public/rewrite_query.h
00001 // Copyright 2011 Google Inc.
00014 
00015 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
00016 #define NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
00017 
00018 #include "net/instaweb/http/public/device_properties.h"
00019 #include "net/instaweb/util/public/gtest_prod.h"
00020 #include "net/instaweb/util/public/scoped_ptr.h"
00021 #include "net/instaweb/util/public/string.h"
00022 #include "net/instaweb/util/public/string_util.h"
00023 
00024 namespace net_instaweb {
00025 
00026 class GoogleUrl;
00027 class MessageHandler;
00028 class QueryParams;
00029 class RequestHeaders;
00030 class ResponseHeaders;
00031 class RewriteDriver;
00032 class RewriteDriverFactory;
00033 class RewriteFilter;
00034 class RewriteOptions;
00035 class ServerContext;
00036 
00037 class RewriteQuery {
00038  public:
00040   static const char kModPagespeed[];
00041   static const char kModPagespeedFilters[];
00046   static const char kNoscriptValue[];
00047 
00048   enum Status {
00049     kSuccess,
00050     kInvalid,
00051     kNoneFound
00052   };
00053 
00078   static Status Scan(bool allow_related_options,
00079                      RewriteDriverFactory* factory,
00080                      ServerContext* server_context,
00081                      GoogleUrl* request_url,
00082                      RequestHeaders* request_headers,
00083                      ResponseHeaders* response_headers,
00084                      scoped_ptr<RewriteOptions>* options,
00085                      MessageHandler* handler);
00086 
00095   template <class HeaderT>
00096   static Status ScanHeader(HeaderT* headers,
00097                            DeviceProperties* device_properties,
00098                            RewriteOptions* options,
00099                            MessageHandler* handler);
00100 
00101 
00106   static GoogleString GenerateResourceOption(StringPiece filter_id,
00107                                              RewriteDriver* driver);
00108 
00109  private:
00110   friend class RewriteQueryTest;
00111   FRIEND_TEST(RewriteQueryTest, ClientOptionsEmptyHeader);
00112   FRIEND_TEST(RewriteQueryTest, ClientOptionsMultipleHeaders);
00113   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder1);
00114   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder2);
00115   FRIEND_TEST(RewriteQueryTest, ClientOptionsCaseInsensitive);
00116   FRIEND_TEST(RewriteQueryTest, ClientOptionsNonDefaultProxyMode);
00117   FRIEND_TEST(RewriteQueryTest, ClientOptionsValidVersionBadOptions);
00118   FRIEND_TEST(RewriteQueryTest, ClientOptionsInvalidVersion);
00119 
00120   enum ProxyMode {
00122     kProxyModeDefault,
00124     kProxyModeNoImageTransform,
00127     kProxyModeNoTransform,
00128   };
00129 
00133   static bool MayHaveCustomOptions(const QueryParams& params,
00134                                    const RequestHeaders* req_headers,
00135                                    const ResponseHeaders* resp_headers);
00136 
00138   template <class HeaderT>
00139   static bool HeadersMayHaveCustomOptions(const QueryParams& params,
00140                                           const HeaderT* headers);
00141 
00143   static Status ScanNameValue(const StringPiece& name,
00144                               const GoogleString& value,
00145                               DeviceProperties* device_properties,
00146                               RewriteOptions* options,
00147                               MessageHandler* handler);
00148 
00150   static Status ParseResourceOption(StringPiece value, RewriteOptions* options,
00151                                     const RewriteFilter* rewrite_filter);
00152 
00155   static bool ParseClientOptions(
00156       const StringPiece& client_options,
00157       ProxyMode* proxy_mode,
00158       DeviceProperties::ImageQualityPreference* image_quality);
00159 
00162   static bool SetEffectiveImageQualities(
00163       DeviceProperties::ImageQualityPreference quality_preference,
00164       DeviceProperties* device_properties,
00165       RewriteOptions* options);
00166 
00168   static bool UpdateRewriteOptionsWithClientOptions(
00169       const GoogleString& header_value, DeviceProperties* device_properties,
00170       RewriteOptions* options);
00171 
00173   static bool ParseProxyMode(const GoogleString* mode_name, ProxyMode* mode);
00174 
00176   static bool ParseImageQualityPreference(
00177       const GoogleString* preference_name,
00178       DeviceProperties::ImageQualityPreference* preference);
00179 };
00180 
00181 }  
00182 
00183 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines