blob: 91c83db44558d6d4a6c84cacd6740ff92bdd2122 [file] [log] [blame]
// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "net/instaweb/rewriter/public/downstream_caching_directives.h"
#include "net/instaweb/public/global_constants.h"
#include "net/instaweb/rewriter/public/rewrite_options.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/http/request_headers.h"
namespace net_instaweb {
const char DownstreamCachingDirectives::kNoCapabilitiesSpecified[] =
"NoCapabilitiesSpecified";
DownstreamCachingDirectives::DownstreamCachingDirectives()
: supports_image_inlining_(kNotSet),
supports_js_defer_(kNotSet),
supports_lazyload_images_(kNotSet),
supports_webp_(kNotSet),
supports_webp_lossless_alpha_(kNotSet),
supports_webp_animated_(kNotSet),
capabilities_to_be_supported_(kNoCapabilitiesSpecified) {
}
DownstreamCachingDirectives::~DownstreamCachingDirectives() {
}
void DownstreamCachingDirectives::ParseCapabilityListFromRequestHeaders(
const RequestHeaders& request_headers) {
const char* capabilities = request_headers.Lookup1(kPsaCapabilityList);
if (capabilities != NULL) {
capabilities_to_be_supported_ = capabilities;
}
// Reset everything.
supports_image_inlining_ = kNotSet;
supports_js_defer_ = kNotSet;
supports_lazyload_images_ = kNotSet;
supports_webp_ = kNotSet;
supports_webp_lossless_alpha_ = kNotSet;
supports_webp_animated_ = kNotSet;
}
bool DownstreamCachingDirectives::IsPropertySupported(
LazyBool* stored_property_support,
const GoogleString& capability,
const GoogleString& supported_capabilities) {
if (*stored_property_support == kNotSet) {
if (supported_capabilities ==
DownstreamCachingDirectives::kNoCapabilitiesSpecified) {
*stored_property_support = kTrue;
} else if (supported_capabilities == capability) {
// Matches "ii" exactly.
*stored_property_support = kTrue;
} else if (supported_capabilities.find(StrCat(capability, ":")) == 0) {
// Matches "ii:" or "ii:abc".
*stored_property_support = kTrue;
} else if (supported_capabilities.find(StrCat(",", capability, ":")) !=
GoogleString::npos) {
// Matches "abc,ii:" or "abc,ii:xyz".
*stored_property_support = kTrue;
} else if (supported_capabilities.find(StrCat(capability, ",")) == 0) {
// Matches "ii," or "ii,abc".
*stored_property_support = kTrue;
} else if (supported_capabilities.find(StrCat(",", capability, ",")) !=
GoogleString::npos) {
// Matches "abc,ii," or "abc,ii,xyz".
*stored_property_support = kTrue;
} else {
*stored_property_support = kFalse;
}
}
return (*stored_property_support == kTrue);
}
bool DownstreamCachingDirectives::SupportsImageInlining() const {
return IsPropertySupported(
&supports_image_inlining_,
RewriteOptions::FilterId(RewriteOptions::kInlineImages),
capabilities_to_be_supported_);
}
bool DownstreamCachingDirectives::SupportsLazyloadImages() const {
return IsPropertySupported(
&supports_lazyload_images_,
RewriteOptions::FilterId(RewriteOptions::kLazyloadImages),
capabilities_to_be_supported_);
}
bool DownstreamCachingDirectives::SupportsJsDefer() const {
return IsPropertySupported(
&supports_js_defer_,
RewriteOptions::FilterId(RewriteOptions::kDeferJavascript),
capabilities_to_be_supported_);
}
bool DownstreamCachingDirectives::SupportsWebp() const {
return IsPropertySupported(
&supports_webp_,
RewriteOptions::FilterId(RewriteOptions::kConvertJpegToWebp),
capabilities_to_be_supported_);
}
bool DownstreamCachingDirectives::SupportsWebpLosslessAlpha() const {
return IsPropertySupported(
&supports_webp_lossless_alpha_,
RewriteOptions::FilterId(RewriteOptions::kConvertToWebpLossless),
capabilities_to_be_supported_);
}
bool DownstreamCachingDirectives::SupportsWebpAnimated() const {
return IsPropertySupported(
&supports_webp_animated_,
RewriteOptions::FilterId(RewriteOptions::kConvertToWebpAnimated),
capabilities_to_be_supported_);
}
} // namespace net_instaweb