Page Speed Optimization Libraries
1.8.31.3
|
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_