// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/http/http_connection_info.h"

#include "base/notreached.h"

namespace net {

std::string_view HttpConnectionInfoToString(
    HttpConnectionInfo connection_info) {
  switch (connection_info) {
    case HttpConnectionInfo::kUNKNOWN:
      return "unknown";
    case HttpConnectionInfo::kHTTP1_1:
      return "http/1.1";
    case HttpConnectionInfo::kDEPRECATED_SPDY2:
      NOTREACHED();
      return "";
    case HttpConnectionInfo::kDEPRECATED_SPDY3:
      return "spdy/3";
    // Since ConnectionInfo is persisted to disk, deprecated values have to be
    // handled. Note that h2-14 and h2-15 are essentially wire compatible with
    // h2.
    // Intentional fallthrough.
    case HttpConnectionInfo::kDEPRECATED_HTTP2_14:
    case HttpConnectionInfo::kDEPRECATED_HTTP2_15:
    case HttpConnectionInfo::kHTTP2:
      return "h2";
    case HttpConnectionInfo::kQUIC_UNKNOWN_VERSION:
      return "http/2+quic";
    case HttpConnectionInfo::kQUIC_32:
      return "http/2+quic/32";
    case HttpConnectionInfo::kQUIC_33:
      return "http/2+quic/33";
    case HttpConnectionInfo::kQUIC_34:
      return "http/2+quic/34";
    case HttpConnectionInfo::kQUIC_35:
      return "http/2+quic/35";
    case HttpConnectionInfo::kQUIC_36:
      return "http/2+quic/36";
    case HttpConnectionInfo::kQUIC_37:
      return "http/2+quic/37";
    case HttpConnectionInfo::kQUIC_38:
      return "http/2+quic/38";
    case HttpConnectionInfo::kQUIC_39:
      return "http/2+quic/39";
    case HttpConnectionInfo::kQUIC_40:
      return "http/2+quic/40";
    case HttpConnectionInfo::kQUIC_41:
      return "http/2+quic/41";
    case HttpConnectionInfo::kQUIC_42:
      return "http/2+quic/42";
    case HttpConnectionInfo::kQUIC_43:
      return "http/2+quic/43";
    case HttpConnectionInfo::kQUIC_44:
      return "http/2+quic/44";
    case HttpConnectionInfo::kQUIC_45:
      return "http/2+quic/45";
    case HttpConnectionInfo::kQUIC_46:
      return "http/2+quic/46";
    case HttpConnectionInfo::kQUIC_47:
      return "http/2+quic/47";
    case HttpConnectionInfo::kQUIC_Q048:
      return "h3-Q048";
    case HttpConnectionInfo::kQUIC_T048:
      return "h3-T048";
    case HttpConnectionInfo::kQUIC_Q049:
      return "h3-Q049";
    case HttpConnectionInfo::kQUIC_T049:
      return "h3-T049";
    case HttpConnectionInfo::kQUIC_Q050:
      return "h3-Q050";
    case HttpConnectionInfo::kQUIC_T050:
      return "h3-T050";
    case HttpConnectionInfo::kQUIC_Q099:
      return "h3-Q099";
    case HttpConnectionInfo::kQUIC_DRAFT_25:
      return "h3-25";
    case HttpConnectionInfo::kQUIC_DRAFT_27:
      return "h3-27";
    case HttpConnectionInfo::kQUIC_DRAFT_28:
      return "h3-28";
    case HttpConnectionInfo::kQUIC_DRAFT_29:
      return "h3-29";
    case HttpConnectionInfo::kQUIC_T099:
      return "h3-T099";
    case HttpConnectionInfo::kHTTP0_9:
      return "http/0.9";
    case HttpConnectionInfo::kHTTP1_0:
      return "http/1.0";
    case HttpConnectionInfo::kQUIC_999:
      return "http2+quic/999";
    case HttpConnectionInfo::kQUIC_T051:
      return "h3-T051";
    case HttpConnectionInfo::kQUIC_RFC_V1:
      return "h3";
    case HttpConnectionInfo::kDEPRECATED_QUIC_2_DRAFT_1:
      return "h3/quic2draft01";
    case HttpConnectionInfo::kQUIC_2_DRAFT_8:
      return "h3/quic2draft08";
  }
}

std::string_view HttpConnectionInfoCoarseToString(
    HttpConnectionInfoCoarse connection_info_coarse) {
  switch (connection_info_coarse) {
    case HttpConnectionInfoCoarse::kHTTP1:
      return "Http1";
    case HttpConnectionInfoCoarse::kHTTP2:
      return "Http2";
    case HttpConnectionInfoCoarse::kQUIC:
      return "Http3";
    case HttpConnectionInfoCoarse::kOTHER:
      return "Other";
  }
}

// Returns a more coarse-grained description of the protocol used to fetch the
// response.
HttpConnectionInfoCoarse HttpConnectionInfoToCoarse(HttpConnectionInfo info) {
  switch (info) {
    case HttpConnectionInfo::kHTTP0_9:
    case HttpConnectionInfo::kHTTP1_0:
    case HttpConnectionInfo::kHTTP1_1:
      return HttpConnectionInfoCoarse::kHTTP1;

    case HttpConnectionInfo::kHTTP2:
    case HttpConnectionInfo::kDEPRECATED_SPDY2:
    case HttpConnectionInfo::kDEPRECATED_SPDY3:
    case HttpConnectionInfo::kDEPRECATED_HTTP2_14:
    case HttpConnectionInfo::kDEPRECATED_HTTP2_15:
      return HttpConnectionInfoCoarse::kHTTP2;

    case HttpConnectionInfo::kQUIC_UNKNOWN_VERSION:
    case HttpConnectionInfo::kQUIC_32:
    case HttpConnectionInfo::kQUIC_33:
    case HttpConnectionInfo::kQUIC_34:
    case HttpConnectionInfo::kQUIC_35:
    case HttpConnectionInfo::kQUIC_36:
    case HttpConnectionInfo::kQUIC_37:
    case HttpConnectionInfo::kQUIC_38:
    case HttpConnectionInfo::kQUIC_39:
    case HttpConnectionInfo::kQUIC_40:
    case HttpConnectionInfo::kQUIC_41:
    case HttpConnectionInfo::kQUIC_42:
    case HttpConnectionInfo::kQUIC_43:
    case HttpConnectionInfo::kQUIC_44:
    case HttpConnectionInfo::kQUIC_45:
    case HttpConnectionInfo::kQUIC_46:
    case HttpConnectionInfo::kQUIC_47:
    case HttpConnectionInfo::kQUIC_Q048:
    case HttpConnectionInfo::kQUIC_T048:
    case HttpConnectionInfo::kQUIC_Q049:
    case HttpConnectionInfo::kQUIC_T049:
    case HttpConnectionInfo::kQUIC_Q050:
    case HttpConnectionInfo::kQUIC_T050:
    case HttpConnectionInfo::kQUIC_Q099:
    case HttpConnectionInfo::kQUIC_T099:
    case HttpConnectionInfo::kQUIC_999:
    case HttpConnectionInfo::kQUIC_DRAFT_25:
    case HttpConnectionInfo::kQUIC_DRAFT_27:
    case HttpConnectionInfo::kQUIC_DRAFT_28:
    case HttpConnectionInfo::kQUIC_DRAFT_29:
    case HttpConnectionInfo::kQUIC_T051:
    case HttpConnectionInfo::kQUIC_RFC_V1:
    case HttpConnectionInfo::kDEPRECATED_QUIC_2_DRAFT_1:
    case HttpConnectionInfo::kQUIC_2_DRAFT_8:
      return HttpConnectionInfoCoarse::kQUIC;

    case HttpConnectionInfo::kUNKNOWN:
      return HttpConnectionInfoCoarse::kOTHER;
  }
}

}  // namespace net
