// Copyright 2015 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.net.oldhttp;

struct URLLoaderStatus {
    /// If the loader has failed due to a network level error, this field will be
    /// set.
    HttpError? error;

    /// Set to true if the URLLoader is still working. Set to false once an error
    /// is encountered or the response body is completely copied to the response
    /// body stream.
    bool is_loading;

    // TODO(darin): Add further details about the stages of loading (e.g.,
    // "resolving host") that happen prior to receiving bytes.
};

protocol URLLoader {
    /// Loads the given `request`, asynchronously producing `response`. Consult
    /// `response` to determine if the request resulted in an error, was
    /// redirected, or has a response body to be consumed.
    Start(URLRequest request) -> (URLResponse response);

    /// If the request passed to `Start` had `auto_follow_redirects` set to false,
    /// then upon receiving an URLResponse with a non-NULL `redirect_url` field,
    /// `FollowRedirect` may be called to load the URL indicated by the redirect.
    FollowRedirect() -> (URLResponse response);

    /// Query status about the URLLoader.
    QueryStatus() -> (URLLoaderStatus status);
};
