summaryrefslogtreecommitdiffstats
path: root/net/quic/spdy_utils.cc
blob: da2345d3fd48ff836b06721aca300bcb7b1fee7e (plain)
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
// Copyright (c) 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/spdy_utils.h"

#include "base/memory/scoped_ptr.h"
#include "net/spdy/spdy_frame_builder.h"
#include "net/spdy/spdy_framer.h"
#include "net/spdy/spdy_protocol.h"

using std::string;

namespace net {

// static
SpdyMajorVersion SpdyUtils::GetSpdyVersionForQuicVersion(
    QuicVersion quic_version) {
  if (quic_version > QUIC_VERSION_24) {
    return SPDY4;
  }
  return SPDY3;
}

// static
string SpdyUtils::SerializeUncompressedHeaders(const SpdyHeaderBlock& headers,
                                               QuicVersion quic_version) {
  SpdyMajorVersion spdy_version = GetSpdyVersionForQuicVersion(quic_version);

  int length = SpdyFramer::GetSerializedLength(spdy_version, &headers);
  SpdyFrameBuilder builder(length, kDefaultSpdyMajorVersion);
  SpdyFramer::WriteHeaderBlock(&builder, kDefaultSpdyMajorVersion, &headers);
  scoped_ptr<SpdyFrame> block(builder.take());
  return string(block->data(), length);
}

// static
SpdyHeaderBlock SpdyUtils::ConvertSpdy3ResponseHeadersToSpdy4(
    SpdyHeaderBlock response_headers) {
  // SPDY/4 headers include neither the version field nor the response details.
  response_headers.erase(":version");
  size_t end_of_code = response_headers[":status"].find(' ');
  if (end_of_code != string::npos) {
    response_headers[":status"].erase(end_of_code);
  }
  return response_headers;
}

}  // namespace net