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

#include "net/quic/quic_http_utils.h"

#include <utility>

#include "base/metrics/histogram_macros.h"
#include "net/spdy/spdy_log_util.h"
#include "net/third_party/quic/platform/api/quic_endian.h"

namespace net {

namespace {

enum AltSvcFormat { GOOGLE_FORMAT = 0, IETF_FORMAT = 1, ALTSVC_FORMAT_MAX };

void RecordAltSvcFormat(AltSvcFormat format) {
  UMA_HISTOGRAM_ENUMERATION("Net.QuicAltSvcFormat", format, ALTSVC_FORMAT_MAX);
}

}  // namespace

spdy::SpdyPriority ConvertRequestPriorityToQuicPriority(
    const RequestPriority priority) {
  DCHECK_GE(priority, MINIMUM_PRIORITY);
  DCHECK_LE(priority, MAXIMUM_PRIORITY);
  return static_cast<spdy::SpdyPriority>(HIGHEST - priority);
}

RequestPriority ConvertQuicPriorityToRequestPriority(
    spdy::SpdyPriority priority) {
  // Handle invalid values gracefully.
  return (priority >= 5) ? IDLE
                         : static_cast<RequestPriority>(HIGHEST - priority);
}

std::unique_ptr<base::Value> QuicRequestNetLogCallback(
    quic::QuicStreamId stream_id,
    const spdy::SpdyHeaderBlock* headers,
    spdy::SpdyPriority priority,
    NetLogCaptureMode capture_mode) {
  std::unique_ptr<base::DictionaryValue> dict(
      static_cast<base::DictionaryValue*>(
          SpdyHeaderBlockNetLogCallback(headers, capture_mode).release()));
  dict->SetInteger("quic_priority", static_cast<int>(priority));
  dict->SetInteger("quic_stream_id", static_cast<int>(stream_id));
  return std::move(dict);
}

quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
    const spdy::SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
    const quic::QuicTransportVersionVector& supported_versions,
    bool support_ietf_format_quic_altsvc) {
  quic::QuicTransportVersionVector supported_alt_svc_versions;
  if (support_ietf_format_quic_altsvc && quic_alt_svc.protocol_id == "hq") {
    // Using IETF format for advertising QUIC. In this case,
    // |alternative_service_entry.version| will store QUIC version labels.
    for (uint32_t quic_version_label : quic_alt_svc.version) {
      for (quic::QuicTransportVersion supported : supported_versions) {
        quic::QuicVersionLabel supported_version_label_network_order =
            QuicVersionToQuicVersionLabel(supported);
        if (supported_version_label_network_order == quic_version_label) {
          supported_alt_svc_versions.push_back(supported);
          RecordAltSvcFormat(IETF_FORMAT);
        }
      }
    }
  } else if (quic_alt_svc.protocol_id == "quic") {
    for (uint32_t quic_version : quic_alt_svc.version) {
      for (quic::QuicTransportVersion supported : supported_versions) {
        if (static_cast<uint32_t>(supported) == quic_version) {
          supported_alt_svc_versions.push_back(supported);
          RecordAltSvcFormat(GOOGLE_FORMAT);
        }
      }
    }
  }
  return supported_alt_svc_versions;
}

}  // namespace net
