// 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
