blob: 4b0058c5d61cb9976302349ae1fb410426c01bda [file] [log] [blame]
/*
* Copyright 2010 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: sligocki@google.com (Shawn Ligocki)
//
// A collection of content-types and their attributes.
#ifndef PAGESPEED_KERNEL_HTTP_CONTENT_TYPE_H_
#define PAGESPEED_KERNEL_HTTP_CONTENT_TYPE_H_
#include <set>
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
namespace net_instaweb {
struct ContentType {
public:
// The MIME types we process.
enum Type {
kHtml,
kXhtml,
kCeHtml, // See http://en.wikipedia.org/wiki/CE-HTML
kJavascript,
kCss,
kText,
kXml,
kPng,
kGif,
kJpeg,
kSwf,
kWebp,
kIco,
kJson,
kSourceMap,
kPdf,
kVideo,
kAudio,
kOctetStream, // Binary resources.
kOther, // Used to specify a new local ContentType in one test file.
};
// Returns the maximum extension length of any resource types our filters
// can create. Does not count the ".".
// See RewriteDriver::CreateOutputResourceWithPath()
static int MaxProducedExtensionLength();
const char* mime_type() const { return mime_type_; }
// TODO(sligocki): Stop returning '.' in file_extension().
const char* file_extension() const { return file_extension_; }
Type type() const { return type_; }
// Return true iff this content type is CSS.
bool IsCss() const;
// Return true iff this content type is JS.
bool IsJs() const;
// Return true iff this content type is HTML, or XHTML, or some other such
// thing (e.g. CE-HTML) that we can rewrite.
bool IsHtmlLike() const;
// Return true iff this content type is XML of some kind (either XHTML or
// some other XML).
bool IsXmlLike() const;
// Return true iff this content type is Flash.
bool IsFlash() const;
// Return true iff this content type is Image.
bool IsImage() const;
// Return true iff this content type is Video.
bool IsVideo() const;
// Return true iff this content type is Audio.
bool IsAudio() const;
// Heuristic to determine whether this should be treated as a static resource.
bool IsLikelyStaticResource() const;
// Heuristic to determine whether compressing the resource is beneficial.
bool IsCompressible() const;
// These fields should be private; we leave them public only so we can use
// struct literals in content_type.cc. Other code should use the above
// accessor methods instead of accessing these fields directly.
const char* mime_type_;
const char* file_extension_; // includes ".", e.g. ".ext"
Type type_;
};
// HTML-like (i.e. rewritable) text:
extern const ContentType& kContentTypeHtml;
extern const ContentType& kContentTypeXhtml;
extern const ContentType& kContentTypeCeHtml;
// Other text:
extern const ContentType& kContentTypeJavascript;
extern const ContentType& kContentTypeCss;
extern const ContentType& kContentTypeText;
extern const ContentType& kContentTypeXml;
extern const ContentType& kContentTypeJson;
extern const ContentType& kContentTypeSourceMap;
// Images:
extern const ContentType& kContentTypePng;
extern const ContentType& kContentTypeGif;
extern const ContentType& kContentTypeJpeg;
extern const ContentType& kContentTypeSwf;
extern const ContentType& kContentTypeWebp;
extern const ContentType& kContentTypeIco;
// PDF:
extern const ContentType& kContentTypePdf;
// Binary/octet-stream.
extern const ContentType& kContentTypeBinaryOctetStream;
// Given a name (file or url), see if it has the canonical extension
// corresponding to a particular content type.
const ContentType* NameExtensionToContentType(const StringPiece& name);
const ContentType* MimeTypeToContentType(const StringPiece& mime_type);
// Extracts mime_type and charset from a string of the form
// "<mime_type>; charset=<charset>".
// If mime_type or charset is not specified, they will be populated
// with the empty string.
// Returns true if either a mime_type or a charset was extracted.
bool ParseContentType(const StringPiece& content_type_str,
GoogleString* mime_type,
GoogleString* charset);
// Splits comma-separated string to elements and tries to match each one with
// a recognized content type. The out set will be cleared first and must be
// present.
void MimeTypeListToContentTypeSet(
const GoogleString& in,
std::set<const ContentType*>* out);
} // namespace net_instaweb
#endif // PAGESPEED_KERNEL_HTTP_CONTENT_TYPE_H_