blob: de418f6336b62e102c8dcef9aa1b790c0db435e8 [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: jmarantz@google.com (Joshua Marantz)
#ifndef NET_INSTAWEB_HTTP_PUBLIC_URL_ASYNC_FETCHER_H_
#define NET_INSTAWEB_HTTP_PUBLIC_URL_ASYNC_FETCHER_H_
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/string.h"
namespace net_instaweb {
class AsyncFetch;
class MessageHandler;
// UrlAsyncFetcher is an interface for asynchronously fetching URLs.
// The results of a fetch are asynchronously passed back to the callbacks
// in the supplied AsyncFetch object.
class UrlAsyncFetcher {
public:
static const int64 kUnspecifiedTimeout;
// Default statistics group name.
static const char kStatisticsGroup[];
virtual ~UrlAsyncFetcher();
// Asynchronously fetch a URL, set the response headers and stream the
// contents to fetch and call fetch->Done() when the fetch finishes.
//
// There is an unchecked contract that response_headers are set before the
// response_writer or callback are used.
// Caution, several implementations do not satisfy this contract (but should).
//
// TODO(sligocki): GoogleString -> GoogleUrl or at least StringPiece.
// TODO(sligocki): Include the URL in the fetch, like the request headers.
virtual void Fetch(const GoogleString& url,
MessageHandler* message_handler,
AsyncFetch* fetch) = 0;
// Determine if the fetcher supports fetching using HTTPS. By default we
// assume a fetcher can.
virtual bool SupportsHttps() const { return true; }
// Returns a maximum time that we will allow fetches to take, or
// kUnspecifiedTimeout (the default) if we don't promise to timeout fetches.
virtual int64 timeout_ms() { return kUnspecifiedTimeout; }
// Stops all active fetches and prevents further fetches from starting,
// calling back to ->Done(false).
//
// Base-class implementation is empty for forward compatibility.
virtual void ShutDown();
// Always requests content from servers using gzip. If the request headers
// do not accept that encoding, then it will be decompressed while streaming.
void set_fetch_with_gzip(bool x) { fetch_with_gzip_ = x; }
bool fetch_with_gzip() const { return fetch_with_gzip_; }
// Returns a new InflatingFetch to handle auto-inflating the
// response if needed.
AsyncFetch* EnableInflation(AsyncFetch* fetch) const;
protected:
// Put this in protected to make sure nobody constructs this class except
// for subclasses.
UrlAsyncFetcher() : fetch_with_gzip_(false) {}
private:
bool fetch_with_gzip_;
DISALLOW_COPY_AND_ASSIGN(UrlAsyncFetcher);
};
} // namespace net_instaweb
#endif // NET_INSTAWEB_HTTP_PUBLIC_URL_ASYNC_FETCHER_H_