blob: 81420a7ce191a1bbccbf9f2fa77c33419dfc14d4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#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_