Page Speed Optimization Libraries  1.8.31.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/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 
00081   Status Scan(bool allow_related_options,
00082               RewriteDriverFactory* factory,
00083               ServerContext* server_context,
00084               GoogleUrl* request_url,
00085               RequestHeaders* request_headers,
00086               ResponseHeaders* response_headers,
00087               MessageHandler* handler);
00088 
00096   template <class HeaderT>
00097   static Status ScanHeader(HeaderT* headers,
00098                            RequestProperties* request_properties,
00099                            RewriteOptions* options,
00100                            MessageHandler* handler);
00101 
00102 
00107   static GoogleString GenerateResourceOption(StringPiece filter_id,
00108                                              RewriteDriver* driver);
00109 
00112   static bool MightBeCustomOption(StringPiece name);
00113 
00114   const QueryParams& query_params() const { return query_params_; }
00115   const QueryParams& pagespeed_query_params() const {
00116     return pagespeed_query_params_;
00117   }
00118   const RewriteOptions* options() const { return options_.get(); }
00119   RewriteOptions* ReleaseOptions() { return options_.release(); }
00120 
00123   static bool IsOK(Status status) {
00124     return (status == kNoneFound) || (status == kSuccess);
00125   }
00126 
00127  private:
00128   friend class RewriteQueryTest;
00129   FRIEND_TEST(RewriteQueryTest, ClientOptionsEmptyHeader);
00130   FRIEND_TEST(RewriteQueryTest, ClientOptionsMultipleHeaders);
00131   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder1);
00132   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder2);
00133   FRIEND_TEST(RewriteQueryTest, ClientOptionsCaseInsensitive);
00134   FRIEND_TEST(RewriteQueryTest, ClientOptionsNonDefaultProxyMode);
00135   FRIEND_TEST(RewriteQueryTest, ClientOptionsValidVersionBadOptions);
00136   FRIEND_TEST(RewriteQueryTest, ClientOptionsInvalidVersion);
00137 
00138   enum ProxyMode {
00140     kProxyModeDefault,
00142     kProxyModeNoImageTransform,
00145     kProxyModeNoTransform,
00146   };
00147 
00151   static bool MayHaveCustomOptions(const QueryParams& params,
00152                                    const RequestHeaders* req_headers,
00153                                    const ResponseHeaders* resp_headers);
00154 
00156   template <class HeaderT>
00157   static bool HeadersMayHaveCustomOptions(const QueryParams& params,
00158                                           const HeaderT* headers);
00159 
00161   static Status ScanNameValue(const StringPiece& name,
00162                               const GoogleString& value,
00163                               RequestProperties* request_properties,
00164                               RewriteOptions* options,
00165                               MessageHandler* handler);
00166 
00168   static Status ParseResourceOption(StringPiece value, RewriteOptions* options,
00169                                     const RewriteFilter* rewrite_filter);
00170 
00173   static bool ParseClientOptions(
00174       const StringPiece& client_options,
00175       ProxyMode* proxy_mode,
00176       DeviceProperties::ImageQualityPreference* image_quality);
00177 
00180   static bool SetEffectiveImageQualities(
00181       DeviceProperties::ImageQualityPreference quality_preference,
00182       RequestProperties* request_properties,
00183       RewriteOptions* options);
00184 
00186   static bool UpdateRewriteOptionsWithClientOptions(
00187       StringPiece header_value, RequestProperties* request_properties,
00188       RewriteOptions* options);
00189 
00191   static bool ParseProxyMode(const GoogleString* mode_name, ProxyMode* mode);
00192 
00194   static bool ParseImageQualityPreference(
00195       const GoogleString* preference_name,
00196       DeviceProperties::ImageQualityPreference* preference);
00197 
00198   QueryParams query_params_;
00199   QueryParams pagespeed_query_params_;
00200   scoped_ptr<RewriteOptions> options_;
00201 
00202   DISALLOW_COPY_AND_ASSIGN(RewriteQuery);
00203 };
00204 
00205 }  
00206 
00207 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines