blob: 833c89e073f98859e853ec75a5daadb5ed254c5c [file] [log] [blame]
// Copyright 2011 Google Inc.
//
// 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.
// Author: abliss@google.com (Adam Bliss)
// Protobuf to encapsulate custom metadata about a resource (not including real
// HTTP Headers).
syntax = "proto2";
import "net/instaweb/spriter/public/image_spriter.proto";
package net_instaweb;
message ImageDim {
optional int32 width = 1 [ default = -1 ];
optional int32 height = 2 [ default = -1 ];
};
// Information about an images indirectly associated with this resource.
message AssociatedImageInfo {
optional string url = 1;
optional ImageDim dimensions = 2;
};
// Info about the input resource that was used to create a CachedResult.
// Next free tag: 10.
message InputInfo {
// Generally, URLs of inputs are not kept in the protobufs, only the indices.
// The intended usage is the URLs of inputs will be used to construct
// the key to a cache entry, and the cache value will be an
// encoded OutputPartitions.
//
// One caveat to this is that in case of a file-loaded input we store its
// filename. This is because it's otherwise too hard to determine the name
// when we need to do cache validation of things like nested
// rewrites, and to keep this information accurate across caching
// of such inner jobs.
optional int32 index = 1;
// This type affects how we check that CachedResults are up-to-date.
enum Type {
// Cached resources are valid until the expiration_time_ms.
CACHED = 1;
// File based resources are valid as long as the file has not changed.
// We stat the file and compare it's mtime to last_modified_time_ms
// to decide if the file has changed or not.
FILE_BASED = 2;
// E.g. data: URL resources never expire or change.
ALWAYS_VALID = 3;
}
required Type type = 2;
// An identifying timestamp which can be used to decide if a resource has
// been updated or not. For web-based resources, we use Last-Modified headers.
// For file-based resources, we use mtime.
optional int64 last_modified_time_ms = 3;
// For CACHED resources, keeps track of when the input expires, as taken
// from the headers returned when it was fetched.
optional int64 expiration_time_ms = 4;
// For FILE_BASED resources, the file this was loaded from.
optional string filename = 5;
// For CACHED resources, we keep track of the original fetch time so we
// can freshen.
optional int64 date_ms = 6;
// For CACHED and FILE_BASED resources, we store a hash of the input, so
// that we can reuse optimization results if it did not change, even if it
// has expired from the HTTP cache.
optional string input_content_hash = 7;
// If true, no later filters should process the same input.
optional bool disable_further_processing = 8;
// To support invalidation by exact URL, we keep the URL in the metadata.
// This bloats the size a bit, but enables fast invalidation. Compressing
// the metadata cache helps.
optional string url = 9;
}
// The cached result of a rewrite. This is the value of a map where the key
// is a sequence of input URLs and a filter id. The input array
// tells us which inputs are used to construct this output; it must be
// interpreted using the URL-sequence that was used to form the key.
// Next free tag: 26
message CachedResult {
// Tags 1-7 are for internal use by output_resource.
// When this is false we have previously processed the URL and have marked
// down that we cannot do anything with it.
optional bool optimizable = 1 [ default = true ];
// The cached URL of this result. If this CachedResult was actually
// fetched from the cache and is not a new one produced by
// EnsureCachedResultCreated this will be valid if and only if
// optimizable is true.
optional string url = 2;
// tags 3, 4 deleted and should not be reused.
// Changes to custom metadata by clients done after we are written to
// cache are lost, and it's extremely easy to get it wrong. To catch
// mistakes like that, we mark a CachedResult as 'frozen' upon save,
// and DCHECK any modifications.
optional bool frozen = 5;
// If the URL is optimizable, this will contain the hash of the encoded
// resource.
optional string hash = 6;
// If the URL is optimizable, this will contain the extension for the
// encoded resource, not including the leading "."
optional string extension = 7;
// Tags 11+ are for use by individual filters. 8-10 have been used
// in the past and should not be reused.
// Dimensions of an image file, in pixels. Used by
// image_rewrite_filter. Note that these dimensions are not
// necessarily the same as the properties of the img tag,
// represented by ResourceContext below.
optional ImageDim image_file_dims = 11;
// Filters that produce inlined data --- either due to inlining an external
// resource or rewriting one that's already inline --- use this field to
// cache either their input or the output. In either case the raw bytes are
// cached without any encoding.
//
// The input is cached in filters that have very cheap rewrites, and
// vary the output based on things like the base URL. Output is cached
// when the rewrite is expensive, with different base URLs being instead
// incorporated into the key.
optional bytes inlined_data = 12;
// The result of a spriting operation, containing x/y coordinates for each
// subimage in the sprite.
// Used by image_combine_filter.
optional spriter.SpriterResult spriter_result = 13;
// Info about the input resources used to create the OutputResource that
// this CachedResult is based off of.
repeated InputInfo input = 14;
// The image type is actually a net_instaweb::ImageType. It permits image
// inlining to create an appropriate data: url from this and the inlined_data.
// It's set only if inlined_data contains an image.
optional int32 inlined_image_type = 15;
// This contains low resolution/quality image contents. This will be set only
// if DelayImagesFilter is enabled.
optional bytes low_resolution_inlined_data = 16;
// The image type is actually a net_instaweb::ImageType. It permits image
// inlining to create an appropriate data: url from this and the
// low_resolution_inlined_data. It's set only if low_resolution_inlined_data
// contains an image.
optional int32 low_resolution_inlined_image_type = 17;
// When this is false we have previously processed the URL and marked down
// that the resource could potentially break if its url were changed.
optional bool url_relocatable = 18 [ default = true ];
// When this is true, the filter should canonicalize the url to the contents
// of url and skip the default resource-based rendering (eg when we recognize
// a JS library and canonicalize its URL).
optional bool canonicalize_url = 19;
// Stores the size of the rewritten resource.
optional int64 size = 20;
// Stores any debug messages for this result, which are injected into the
// HTML as comments if the debug filter is enabled.
repeated string debug_message = 21;
optional ResourceContext.LibWebpLevel
deprecated_minimal_webp_support = 22
[ default = LIBWEBP_LOSSY_ONLY, deprecated = true ];
// Information about any images indirectly included via this resource, or
// its dependencies.
repeated AssociatedImageInfo associated_image_info = 23;
// Does this CachedResult represent an InlineOutputResource?
// If false, this represents a plain OutputResource instead.
optional bool is_inline_output_resource = 24;
// Type of the optimized image. This is actually net_instaweb::ImageType.
optional int32 optimized_image_type = 25;
}
// Contains the mapping of input URLs to output URLs. In the general
// case, multiple inputs may map to multiple outputs.
//
// Consider combine_css (slightly more capable than it is today) over
// the links:
// <link media="print" href="p0.css"/>
// <link media="screen" href="p1.css"/>
// <link media="print" href="p2.css"/>
// <link media="screen" href="p3.css"/>
// Combining these would result in two partitions.
// partition0 = {result="p0+p2.css", input={0,2}}
// partition1 = {result="p1+p3.css", input={1,3}}
// Thus the CSS combiner can, as the result of one cache lookup, get
// back enough information to perform the HTML element substitutions.
//
// If this resource depends on inputs that are not mentioned in the partition
// table above (such as inputs to nested rewrites or those that failed to
// fetch properly) we add them to other_dependency to know when to invalidate.
message OutputPartitions {
repeated CachedResult partition = 1;
repeated InputInfo other_dependency = 2;
// Debug messages which can be used even if there are no partitions.
repeated string debug_message = 3;
}
// Encapsulates all the data needed to rewrite a resource. Any filter needing
// additional information should add it as optional fields here.
// Next free tag: 9
message ResourceContext {
optional ImageDim desired_image_dims = 1;
optional bool attempt_webp = 2 [ deprecated = true ];
optional bool inline_images = 3 [ default = true ];
optional bool mobile_user_agent = 4;
enum LibWebpLevel {
LIBWEBP_NONE = 0;
LIBWEBP_LOSSY_ONLY = 1;
LIBWEBP_LOSSY_LOSSLESS_ALPHA = 2;
LIBWEBP_ANIMATED = 3;
}
optional LibWebpLevel libwebp_level = 5 [default = LIBWEBP_NONE];
optional ImageDim user_agent_screen_resolution = 6 [deprecated = true];
// Set to true if we may use the image qualities set for small screen.
optional bool may_use_small_screen_quality = 7;
// Set to true if we may use the image qualities set for save-data. The
// request must have "Save-Data: on" header to make this true. If true,
// we'll add a unique identifier to the cache key.
optional bool may_use_save_data_quality = 8;
}