Page Speed Optimization Libraries  1.7.30.4
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/rewriter/public/device_properties.h"
00019 #include "net/instaweb/util/public/gtest_prod.h"
00020 #include "net/instaweb/util/public/query_params.h"
00021 #include "net/instaweb/util/public/string.h"
00022 #include "net/instaweb/util/public/string_util.h"
00023 #include "pagespeed/kernel/base/basictypes.h"
00024 #include "pagespeed/kernel/base/scoped_ptr.h"
00025 
00026 namespace net_instaweb {
00027 
00028 class GoogleUrl;
00029 class MessageHandler;
00030 class RequestHeaders;
00031 class RequestProperties;
00032 class ResponseHeaders;
00033 class RewriteDriver;
00034 class RewriteDriverFactory;
00035 class RewriteFilter;
00036 class RewriteOptions;
00037 class ServerContext;
00038 
00039 class RewriteQuery {
00040  public:
00042   static const char kModPagespeed[];
00043   static const char kPageSpeed[];
00044   static const char kModPagespeedFilters[];
00045   static const char kPageSpeedFilters[];
00050   static const char kNoscriptValue[];
00051 
00052   enum Status {
00053     kSuccess,
00054     kInvalid,
00055     kNoneFound
00056   };
00057 
00058   RewriteQuery();
00059   ~RewriteQuery();
00060 
00080   Status Scan(bool allow_related_options,
00081               RewriteDriverFactory* factory,
00082               ServerContext* server_context,
00083               GoogleUrl* request_url,
00084               RequestHeaders* request_headers,
00085               ResponseHeaders* response_headers,
00086               MessageHandler* handler);
00087 
00095   template <class HeaderT>
00096   static Status ScanHeader(HeaderT* headers,
00097                            RequestProperties* request_properties,
00098                            RewriteOptions* options,
00099                            MessageHandler* handler);
00100 
00101 
00106   static GoogleString GenerateResourceOption(StringPiece filter_id,
00107                                              RewriteDriver* driver);
00108 
00111   static bool MightBeCustomOption(StringPiece name);
00112 
00113   const QueryParams& query_params() const { return query_params_; }
00114   const RewriteOptions* options() const { return options_.get(); }
00115   RewriteOptions* ReleaseOptions() { return options_.release(); }
00116 
00119   static bool IsOK(Status status) {
00120     return (status == kNoneFound) || (status == kSuccess);
00121   }
00122 
00123  private:
00124   friend class RewriteQueryTest;
00125   FRIEND_TEST(RewriteQueryTest, ClientOptionsEmptyHeader);
00126   FRIEND_TEST(RewriteQueryTest, ClientOptionsMultipleHeaders);
00127   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder1);
00128   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder2);
00129   FRIEND_TEST(RewriteQueryTest, ClientOptionsCaseInsensitive);
00130   FRIEND_TEST(RewriteQueryTest, ClientOptionsNonDefaultProxyMode);
00131   FRIEND_TEST(RewriteQueryTest, ClientOptionsValidVersionBadOptions);
00132   FRIEND_TEST(RewriteQueryTest, ClientOptionsInvalidVersion);
00133 
00134   enum ProxyMode {
00136     kProxyModeDefault,
00138     kProxyModeNoImageTransform,
00141     kProxyModeNoTransform,
00142   };
00143 
00147   static bool MayHaveCustomOptions(const QueryParams& params,
00148                                    const RequestHeaders* req_headers,
00149                                    const ResponseHeaders* resp_headers);
00150 
00152   template <class HeaderT>
00153   static bool HeadersMayHaveCustomOptions(const QueryParams& params,
00154                                           const HeaderT* headers);
00155 
00157   static Status ScanNameValue(const StringPiece& name,
00158                               const GoogleString& value,
00159                               RequestProperties* request_properties,
00160                               RewriteOptions* options,
00161                               MessageHandler* handler);
00162 
00164   static Status ParseResourceOption(StringPiece value, RewriteOptions* options,
00165                                     const RewriteFilter* rewrite_filter);
00166 
00169   static bool ParseClientOptions(
00170       const StringPiece& client_options,
00171       ProxyMode* proxy_mode,
00172       DeviceProperties::ImageQualityPreference* image_quality);
00173 
00176   static bool SetEffectiveImageQualities(
00177       DeviceProperties::ImageQualityPreference quality_preference,
00178       RequestProperties* request_properties,
00179       RewriteOptions* options);
00180 
00182   static bool UpdateRewriteOptionsWithClientOptions(
00183       StringPiece header_value, RequestProperties* request_properties,
00184       RewriteOptions* options);
00185 
00187   static bool ParseProxyMode(const GoogleString* mode_name, ProxyMode* mode);
00188 
00190   static bool ParseImageQualityPreference(
00191       const GoogleString* preference_name,
00192       DeviceProperties::ImageQualityPreference* preference);
00193 
00194   QueryParams query_params_;
00195   scoped_ptr<RewriteOptions> options_;
00196 
00197   DISALLOW_COPY_AND_ASSIGN(RewriteQuery);
00198 };
00199 
00200 }  
00201 
00202 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines