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