1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_DEVICE_BOUND_SESSIONS_SESSION_CHALLENGE_PARAM_H_
#define NET_DEVICE_BOUND_SESSIONS_SESSION_CHALLENGE_PARAM_H_
#include <optional>
#include <string>
#include <vector>
#include "net/base/net_export.h"
#include "net/http/structured_headers.h"
// Forward declarations.
class GURL;
namespace net {
class HttpResponseHeaders;
}
namespace net::device_bound_sessions {
// Class to parse Sec-Session-Challenge header.
// See explainer for details:
// https://github.com/WICG/dbsc/blob/main/README.md.
// It is a RFC 8941 list of challenges for the associated DBSC sessions.
// Example:
// Sec-Session-Challenge: "challenge";id="session_id".
// Sec-Session-Challenge: "challenge";id="session_id", "challenge1";id="id1".
// The session id may be unknown during the session registration, hence it can
// be omitted:
// Sec-Session-Challenge: "challenge".
// It is possible to have multiple Sec-Session-Challenge headers in
// one response. If multiple challenges are given for one specific session,
// the last one will take effect.
class NET_EXPORT SessionChallengeParam {
public:
SessionChallengeParam(SessionChallengeParam&& other) noexcept;
SessionChallengeParam& operator=(SessionChallengeParam&& other) noexcept;
~SessionChallengeParam();
// Returns a vector of valid instances from the headers.
// Checks `headers` for any Sec-Session-Challenge headers. Parses any valid
// ones that are found into `SessionChallengeParam` instances and returns a
// vector of these. `request_url` corresponds to the request that returned
// these headers; it is used only to affirm that that URL is valid.
static std::vector<SessionChallengeParam> CreateIfValid(
const GURL& request_url,
const HttpResponseHeaders* headers);
const std::optional<std::string>& session_id() const { return session_id_; }
const std::string& challenge() const { return challenge_; }
private:
SessionChallengeParam(std::optional<std::string> session_id,
std::string challenge);
static std::optional<SessionChallengeParam> ParseItem(
const structured_headers::ParameterizedMember& session_challenge);
std::optional<std::string> session_id_;
std::string challenge_;
};
} // namespace net::device_bound_sessions
#endif // NET_DEVICE_BOUND_SESSIONS_SESSION_CHALLENGE_PARAM_H_
|