Page Speed Optimization Libraries  1.8.31.3
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/http/public/request_context.h"
00022 #include "net/instaweb/util/public/string.h"
00023 #include "net/instaweb/util/public/string_util.h"
00024 #include "pagespeed/kernel/base/basictypes.h"
00025 #include "pagespeed/kernel/base/scoped_ptr.h"
00026 #include "pagespeed/kernel/http/headers.h"
00027 #include "pagespeed/kernel/http/request_headers.h"
00028 
00029 namespace net_instaweb {
00030 
00031 class GoogleUrl;
00032 class MessageHandler;
00033 class RequestProperties;
00034 class ResponseHeaders;
00035 class RewriteDriver;
00036 class RewriteDriverFactory;
00037 class RewriteFilter;
00038 class RewriteOptions;
00039 class ServerContext;
00040 
00041 class RewriteQuery {
00042  public:
00044   static const char kModPagespeed[];
00045   static const char kPageSpeed[];
00046   static const char kModPagespeedFilters[];
00047   static const char kPageSpeedFilters[];
00052   static const char kNoscriptValue[];
00053 
00054   enum Status {
00055     kSuccess,
00056     kInvalid,
00057     kNoneFound
00058   };
00059 
00060   RewriteQuery();
00061   ~RewriteQuery();
00062 
00089   Status Scan(bool allow_related_options,
00090               bool allow_options_to_be_specified_by_cookies,
00091               const GoogleString& request_option_override,
00092               const RequestContextPtr& request_context,
00093               RewriteDriverFactory* factory,
00094               ServerContext* server_context,
00095               GoogleUrl* request_url,
00096               RequestHeaders* request_headers,
00097               ResponseHeaders* response_headers,
00098               MessageHandler* handler);
00099 
00107   template <class HeaderT>
00108   static Status ScanHeader(bool allow_options,
00109                            const GoogleString& request_option_override,
00110                            const RequestContextPtr& request_context,
00111                            HeaderT* headers,
00112                            RequestProperties* request_properties,
00113                            RewriteOptions* options,
00114                            MessageHandler* handler);
00115 
00116 
00121   static GoogleString GenerateResourceOption(StringPiece filter_id,
00122                                              RewriteDriver* driver);
00123 
00126   static bool MightBeCustomOption(StringPiece name);
00127 
00128   const QueryParams& query_params() const { return query_params_; }
00129   const QueryParams& pagespeed_query_params() const {
00130     return pagespeed_query_params_;
00131   }
00132   const QueryParams& pagespeed_option_cookies() const {
00133     return pagespeed_option_cookies_;
00134   }
00135   const RewriteOptions* options() const { return options_.get(); }
00136   RewriteOptions* ReleaseOptions() { return options_.release(); }
00137 
00140   static bool IsOK(Status status) {
00141     return (status == kNoneFound) || (status == kSuccess);
00142   }
00143 
00144  private:
00145   friend class RewriteQueryTest;
00146   FRIEND_TEST(RewriteQueryTest, ClientOptionsEmptyHeader);
00147   FRIEND_TEST(RewriteQueryTest, ClientOptionsMultipleHeaders);
00148   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder1);
00149   FRIEND_TEST(RewriteQueryTest, ClientOptionsOrder2);
00150   FRIEND_TEST(RewriteQueryTest, ClientOptionsCaseInsensitive);
00151   FRIEND_TEST(RewriteQueryTest, ClientOptionsNonDefaultProxyMode);
00152   FRIEND_TEST(RewriteQueryTest, ClientOptionsValidVersionBadOptions);
00153   FRIEND_TEST(RewriteQueryTest, ClientOptionsInvalidVersion);
00154 
00155   enum ProxyMode {
00157     kProxyModeDefault,
00159     kProxyModeNoImageTransform,
00162     kProxyModeNoTransform,
00163   };
00164 
00168   static bool MayHaveCustomOptions(
00169       const QueryParams& params, const RequestHeaders* req_headers,
00170       const ResponseHeaders* resp_headers,
00171       const RequestHeaders::CookieMultimap& cookies);
00172 
00174   template <class HeaderT>
00175   static bool HeadersMayHaveCustomOptions(const QueryParams& params,
00176                                           const HeaderT* headers);
00177 
00179   static bool CookiesMayHaveCustomOptions(
00180       const RequestHeaders::CookieMultimap& cookies);
00181 
00183   static Status ScanNameValue(const StringPiece& name,
00184                               const StringPiece& value,
00185                               bool allow_options,
00186                               const RequestContextPtr& request_context,
00187                               RequestProperties* request_properties,
00188                               RewriteOptions* options,
00189                               MessageHandler* handler);
00190 
00192   static Status ParseResourceOption(StringPiece value, RewriteOptions* options,
00193                                     const RewriteFilter* rewrite_filter);
00194 
00197   static bool ParseClientOptions(
00198       const StringPiece& client_options,
00199       ProxyMode* proxy_mode,
00200       DeviceProperties::ImageQualityPreference* image_quality);
00201 
00204   static bool SetEffectiveImageQualities(
00205       DeviceProperties::ImageQualityPreference quality_preference,
00206       RequestProperties* request_properties,
00207       RewriteOptions* options);
00208 
00210   static bool UpdateRewriteOptionsWithClientOptions(
00211       StringPiece header_value, RequestProperties* request_properties,
00212       RewriteOptions* options);
00213 
00215   static bool ParseProxyMode(const GoogleString* mode_name, ProxyMode* mode);
00216 
00218   static bool ParseImageQualityPreference(
00219       const GoogleString* preference_name,
00220       DeviceProperties::ImageQualityPreference* preference);
00221 
00222   QueryParams query_params_;
00223   QueryParams pagespeed_query_params_;
00224   QueryParams pagespeed_option_cookies_;
00225   scoped_ptr<RewriteOptions> options_;
00226 
00227   DISALLOW_COPY_AND_ASSIGN(RewriteQuery);
00228 };
00229 
00230 }  
00231 
00232 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_QUERY_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines