| /* |
| * 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_ |