blob: 276a4f2d8ada48d49b12060349bea0929fb77b09 [file] [log] [blame]
// Copyright 2010 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.
//
// Author: jmarantz@google.com (Joshua Marantz)
#ifndef PAGESPEED_APACHE_HEADER_UTIL_H_
#define PAGESPEED_APACHE_HEADER_UTIL_H_
#include <cstddef>
#include "pagespeed/kernel/base/callback.h"
#include "pagespeed/kernel/base/string_util.h"
struct request_rec;
namespace net_instaweb {
class RequestHeaders;
class ResponseHeaders;
// Defines a predicate function used to select which request-headers
// to copy. The callback sets the bool* arg (.second) to true if
// it wants to include the header.
//
// The StringPiece is the name of the header.
typedef Callback2<StringPiece, bool*> HeaderPredicateFn;
// Converts Apache header structure into RequestHeaders, selecting
// only those for which the predicate sets its bool* argument to true.
// If the predicate is NULL, then all the headers are transferred.
//
// The predicate should be created with NewPermanentCallback and stored
// in a scoped_ptr<Callback2>, so that it is deleted after this function
// completes.
void ApacheRequestToRequestHeaders(const request_rec& request,
RequestHeaders* request_headers,
HeaderPredicateFn* predicate);
// Fully converts apache request header structure into RequestHeaders.
inline void ApacheRequestToRequestHeaders(const request_rec& request,
RequestHeaders* request_headers) {
return ApacheRequestToRequestHeaders(request, request_headers, NULL);
}
// Converts Apache header structure (request.headers_out) into ResponseHeaders
// headers. If err_headers is not NULL then request.err_headers_out is copied
// into it. In the event that headers == err_headers, the headers from
// request.err_headers_out will be appended to the list of headers, but no
// merging occurs.
void ApacheRequestToResponseHeaders(const request_rec& request,
ResponseHeaders* headers,
ResponseHeaders* err_headers);
// Converts the ResponseHeaders to the output headers. This function
// does not alter the status code or the major/minor version of the
// Apache request.
void ResponseHeadersToApacheRequest(const ResponseHeaders& response_headers,
request_rec* request);
// Converts ResponseHeaders into Apache request err_headers. This
// function does not alter the status code or the major/minor version
// of the Apache request.
void ErrorHeadersToApacheRequest(const ResponseHeaders& err_response_headers,
request_rec* request);
// Remove downstream filters that might corrupt our caching headers.
void DisableDownstreamHeaderFilters(request_rec* request);
// Debug utility for printing Apache headers to stdout
void PrintHeaders(request_rec* request);
// Get request->headers_out as a string, intended for tests.
GoogleString HeadersOutToString(request_rec* request);
// Get request->subprocess_env as a string, intended for tests.
GoogleString SubprocessEnvToString(request_rec* request);
// Updates headers related to caching (but not Cache-Control).
void DisableCachingRelatedHeaders(request_rec* request);
// Updates caching headers to ensure the resulting response is not cached.
// Removes any max-age specification, and adds max-age=0, no-cache.
void DisableCacheControlHeader(request_rec* request);
} // namespace net_instaweb
#endif // PAGESPEED_APACHE_HEADER_UTIL_H_