125 lines
3.5 KiB
C++
125 lines
3.5 KiB
C++
/*
|
|
* Copyright 2014 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: kspoelstra@we-amp.com (Kees Spoelstra)
|
|
|
|
/*
|
|
* NgxGZipSetter sets up gzip for pagespeed
|
|
* with the following configuration:
|
|
* gzip on;
|
|
* gzip_vary on;
|
|
* gzip_types application/ecmascript;
|
|
* gzip_types application/javascript;
|
|
* gzip_types application/json;
|
|
* gzip_types application/pdf;
|
|
* gzip_types application/postscript;
|
|
* gzip_types application/x-javascript;
|
|
* gzip_types image/svg+xml;
|
|
* gzip_types text/css;
|
|
* gzip_types text/csv;
|
|
* gzip_types text/javascript;
|
|
* gzip_types text/plain;
|
|
* gzip_types text/xml;
|
|
* gzip_http_version 1.0;
|
|
*
|
|
* If there is an explicit gzip configuration in the nginx.conf
|
|
* pagespeed will rollback the set configuration and let the
|
|
* user decide what the configuration will be.
|
|
*
|
|
* It manipulates the configuration by manipulating ngx_flag_t
|
|
* and ngx_uint_t settings directly and using the nginx setter for
|
|
* gzip_http_types.
|
|
* This is probably a safe way to do it. If this mechanism
|
|
* changes all non nginx module setup & configuration will
|
|
* fail.
|
|
*/
|
|
|
|
#ifndef NGX_GZIP_SETTER_H_
|
|
#define NGX_GZIP_SETTER_H_
|
|
|
|
extern "C" {
|
|
#include <ngx_config.h>
|
|
#include <ngx_core.h>
|
|
#include <ngx_http.h>
|
|
}
|
|
|
|
#include <vector>
|
|
|
|
#include "ngx_pagespeed.h"
|
|
|
|
#include "pagespeed/kernel/base/basictypes.h"
|
|
|
|
namespace net_instaweb {
|
|
|
|
// We need this class because configuration for gzip is in different modules, so
|
|
// just saving the command will not work.
|
|
class ngx_command_ctx {
|
|
public:
|
|
ngx_command_ctx() : command_(NULL), module_(NULL) { }
|
|
void* GetConfPtr(ngx_conf_t* cf);
|
|
char* GetModuleConfPtr(ngx_conf_t* cf);
|
|
ngx_command_t* command_;
|
|
ngx_module_t* module_;
|
|
};
|
|
|
|
enum gzs_enable_result {
|
|
kEnableGZipOk,
|
|
kEnableGZipPartial,
|
|
kEnableGZipNotEnabled
|
|
};
|
|
|
|
class NgxGZipSetter {
|
|
std::vector<ngx_flag_t*> ngx_flags_set_;
|
|
std::vector<ngx_uint_t*> ngx_uint_set_;
|
|
std::vector<void*> ngx_httptypes_set_;
|
|
ngx_command_ctx gzip_command_;
|
|
ngx_command_ctx gzip_http_types_command_;
|
|
ngx_command_ctx gzip_proxied_command_;
|
|
ngx_command_ctx gzip_vary_command_;
|
|
ngx_command_ctx gzip_http_version_command_;
|
|
bool enabled_;
|
|
|
|
public:
|
|
NgxGZipSetter();
|
|
~NgxGZipSetter();
|
|
void Init(ngx_conf_t* cf);
|
|
|
|
void SetNgxConfFlag(ngx_conf_t* cf,
|
|
ngx_command_ctx* command_ctx,
|
|
ngx_flag_t value);
|
|
void SetNgxConfEnum(ngx_conf_t* cf,
|
|
ngx_command_ctx* command_ctx,
|
|
ngx_uint_t value);
|
|
void SetNgxConfBitmask(ngx_conf_t* cf,
|
|
ngx_command_ctx* command_ctx,
|
|
ngx_uint_t value);
|
|
void EnableGZipForLocation(ngx_conf_t* cf);
|
|
gzs_enable_result SetGZipForLocation(ngx_conf_t* cf, bool value);
|
|
void AddGZipHTTPTypes(ngx_conf_t* cf);
|
|
void RollBackAndDisable(ngx_conf_t* cf);
|
|
|
|
bool enabled() { return enabled_; }
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NgxGZipSetter);
|
|
};
|
|
|
|
extern NgxGZipSetter g_gzip_setter;
|
|
|
|
} // namespace net_instaweb
|
|
|
|
#endif // NGX_GZIP_SETTER_H_
|