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