You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2015/05/15 00:13:23 UTC
[2/3] trafficserver git commit: TS-3602 Remove old SPDY plugin
TS-3602 Remove old SPDY plugin
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/6b25aec8
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/6b25aec8
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/6b25aec8
Branch: refs/heads/master
Commit: 6b25aec815b5dd97a7cbb13dcb94a30eb00d2348
Parents: 3cb9a3c
Author: Leif Hedstrom <zw...@apache.org>
Authored: Wed May 13 23:15:12 2015 -0600
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Wed May 13 23:15:12 2015 -0600
----------------------------------------------------------------------
plugins/experimental/spdy/Makefile.am | 56 --
plugins/experimental/spdy/TODO | 20 -
plugins/experimental/spdy/http.cc | 264 ----------
plugins/experimental/spdy/http.h | 89 ----
plugins/experimental/spdy/io.cc | 89 ----
plugins/experimental/spdy/io.h | 181 -------
plugins/experimental/spdy/lib/base/atomic.h | 62 ---
plugins/experimental/spdy/lib/base/inet.h | 78 ---
plugins/experimental/spdy/lib/base/logging.cc | 48 --
plugins/experimental/spdy/lib/base/logging.h | 72 ---
plugins/experimental/spdy/lib/spdy/message.cc | 506 -------------------
plugins/experimental/spdy/lib/spdy/spdy.h | 306 -----------
plugins/experimental/spdy/lib/spdy/zstream.cc | 129 -----
plugins/experimental/spdy/lib/spdy/zstream.h | 121 -----
plugins/experimental/spdy/protocol.cc | 168 ------
plugins/experimental/spdy/protocol.h | 31 --
plugins/experimental/spdy/spdy.cc | 363 -------------
plugins/experimental/spdy/stream.cc | 351 -------------
plugins/experimental/spdy/strings.cc | 100 ----
plugins/experimental/spdy/tests/stubs.cc | 39 --
plugins/experimental/spdy/tests/zstream_test.cc | 194 -------
21 files changed, 3267 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/Makefile.am
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/Makefile.am b/plugins/experimental/spdy/Makefile.am
deleted file mode 100644
index 2c32398..0000000
--- a/plugins/experimental/spdy/Makefile.am
+++ /dev/null
@@ -1,56 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-include $(top_srcdir)/build/plugins.mk
-
-if BUILD_HAVE_CXX_11
-
-pkglib_LTLIBRARIES = spdy.la
-noinst_LTLIBRARIES = libspdycore.la
-check_PROGRAMS = zstream_test
-
-AM_CPPFLAGS += \
- -I$(srcdir)/lib
-
-if BUILD_HAVE_LIBCXX
-AM_CXXFLAGS += -stdlib=libc++
-endif
-
-spdy_la_SOURCES = \
- http.cc \
- io.cc \
- protocol.cc \
- spdy.cc \
- stream.cc \
- strings.cc
-
-libspdycore_la_SOURCES = \
- lib/base/logging.cc \
- lib/spdy/message.cc \
- lib/spdy/zstream.cc
-
-spdy_la_LIBADD = libspdycore.la
-spdy_la_LDFLAGS = $(TS_PLUGIN_LDFLAGS)
-
-zstream_test_SOURCES = tests/zstream_test.cc tests/stubs.cc
-zstream_test_LDADD = libspdycore.la -lz
-
-TESTS = $(check_PROGRAMS)
-
-test:: $(TESTS)
- for f in $(TESTS) ; do $$f ; done
-
-endif # BUILD_HAVE_CXX_11
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/TODO
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/TODO b/plugins/experimental/spdy/TODO
deleted file mode 100644
index b0c08dd..0000000
--- a/plugins/experimental/spdy/TODO
+++ /dev/null
@@ -1,20 +0,0 @@
-- Testing, testing, testing
-
- Currently, this plugin always crashes when sending a response.
- It's probably a small fix, but the whole thing is *very* lightly
- tested.
-
-- SPDY/4 protocol support
-
- If SPDY/4 ever gets any traction we should implement that. At this point,
- it's probably worth using a third-party SPDY marshalling library.
-
-- Chunked encoding support
-
- Figure out what's neede to support origin servers sending chunked
- requests.
-
-- SPDY client suport
-
- Is might be useful to support sending SPDY requests to origin
- servers. This would be necessary for push support, for example.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/http.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/http.cc b/plugins/experimental/spdy/http.cc
deleted file mode 100644
index 63b241a..0000000
--- a/plugins/experimental/spdy/http.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// http.cc - Low level routines to write HTTP messages.
-
-#include "ts/ts.h"
-#include "ink_defs.h"
-
-#include <spdy/spdy.h>
-#include <base/logging.h>
-#include "io.h"
-#include "http.h"
-#include "protocol.h"
-
-static void
-populate_http_headers(TSMBuffer buffer, TSMLoc header, spdy::protocol_version version, spdy::key_value_block &kvblock)
-{
- char status[128];
- char httpvers[sizeof("HTTP/xx.xx")];
-
- int vers = TSHttpHdrVersionGet(buffer, header);
- TSHttpStatus code = TSHttpHdrStatusGet(buffer, header);
-
- snprintf(status, sizeof(status), "%u %s", (unsigned)code, TSHttpHdrReasonLookup(code));
- snprintf(httpvers, sizeof(httpvers), "HTTP/%u.%u", TS_HTTP_MAJOR(vers), TS_HTTP_MINOR(vers));
-
- if (version == spdy::PROTOCOL_VERSION_2) {
- kvblock["status"] = status;
- kvblock["version"] = httpvers;
- } else {
- kvblock[":status"] = status;
- kvblock[":version"] = httpvers;
- }
-}
-
-void
-http_send_response(spdy_io_stream *stream, TSMBuffer buffer, TSMLoc header)
-{
- TSMLoc field;
- spdy::key_value_block kvblock;
-
- debug_http_header(stream, buffer, header);
-
- field = TSMimeHdrFieldGet(buffer, header, 0);
- while (field) {
- TSMLoc next;
- std::pair<const char *, int> name;
- std::pair<const char *, int> value;
-
- name.first = TSMimeHdrFieldNameGet(buffer, header, field, &name.second);
-
- // XXX zwoop says that pointer comparisons ought to be
- // sufficient here. If we can test and confirm, we can
- // remove all the strcmp()s.
-
- // The Connection, Keep-Alive, Proxy-Connection, and
- // Transfer-Encoding headers are not valid and MUST not be
- // sent.
- if (strcmp(name.first, TS_MIME_FIELD_CONNECTION) == 0 || strcmp(name.first, TS_MIME_FIELD_KEEP_ALIVE) == 0 ||
- strcmp(name.first, TS_MIME_FIELD_PROXY_CONNECTION) == 0 || strcmp(name.first, TS_MIME_FIELD_TRANSFER_ENCODING) == 0) {
- debug_http("[%p/%u] skipping %s header", stream->io, stream->stream_id, name.first);
- goto skip;
- }
-
- value.first = TSMimeHdrFieldValueStringGet(buffer, header, field, -1, &value.second);
- kvblock.insert(std::string(name.first, name.second), std::string(value.first, value.second));
-
- skip:
- next = TSMimeHdrFieldNext(buffer, header, field);
- TSHandleMLocRelease(buffer, header, field);
- field = next;
- }
-
- populate_http_headers(buffer, header, stream->version, kvblock);
- spdy_send_syn_reply(stream, kvblock);
-}
-
-void
-http_send_error(spdy_io_stream *stream, TSHttpStatus status)
-{
- scoped_mbuffer buffer;
- scoped_http_header header(buffer.get());
-
- TSHttpHdrTypeSet(buffer.get(), header.get(), TS_HTTP_TYPE_RESPONSE);
- TSHttpHdrVersionSet(buffer.get(), header.get(), TS_HTTP_VERSION(1, 1));
- TSHttpHdrStatusSet(buffer.get(), header.get(), status);
-
- debug_http("[%p/%u] sending a HTTP %d result for %s %s://%s%s", stream->io, stream->stream_id, status,
- stream->kvblock.url().method.c_str(), stream->kvblock.url().scheme.c_str(), stream->kvblock.url().hostport.c_str(),
- stream->kvblock.url().path.c_str());
-
- http_send_response(stream, buffer.get(), header.get());
- spdy_send_data_frame(stream, spdy::FLAG_FIN, nullptr, 0);
-}
-
-void
-http_send_content(spdy_io_stream *stream, TSIOBufferReader reader)
-{
- TSIOBufferBlock blk;
- int64_t consumed = 0;
-
- blk = TSIOBufferReaderStart(stream->input.reader);
- while (blk) {
- const char *ptr;
- int64_t nbytes;
-
- ptr = TSIOBufferBlockReadStart(blk, reader, &nbytes);
- if (ptr && nbytes) {
- spdy_send_data_frame(stream, 0 /* flags */, ptr, nbytes);
- consumed += nbytes;
- }
-
- blk = TSIOBufferBlockNext(blk);
- }
-
- TSIOBufferReaderConsume(reader, consumed);
-}
-
-void
-debug_http_header(const spdy_io_stream *stream, TSMBuffer buffer, TSMLoc header)
-{
- if (unlikely(TSIsDebugTagSet("spdy.http"))) {
- spdy_io_buffer iobuf;
- int64_t nbytes;
- int64_t avail;
- const char *ptr;
- TSIOBufferBlock blk;
-
- TSHttpHdrPrint(buffer, header, iobuf.buffer);
- blk = TSIOBufferReaderStart(iobuf.reader);
- avail = TSIOBufferBlockReadAvail(blk, iobuf.reader);
- ptr = (const char *)TSIOBufferBlockReadStart(blk, iobuf.reader, &nbytes);
-
- debug_http("[%p/%u] http request (%" PRIu64 " of %" PRIu64 " bytes):\n%*.*s", stream, stream->stream_id, nbytes, avail,
- (int)nbytes, (int)nbytes, ptr);
- }
-}
-
-http_parser::http_parser() : parser(TSHttpParserCreate()), mbuffer(), header(mbuffer.get()), complete(false)
-{
-}
-
-http_parser::~http_parser()
-{
- if (parser) {
- TSHttpParserDestroy(parser);
- }
-}
-
-ssize_t
-http_parser::parse(TSIOBufferReader reader)
-{
- TSIOBufferBlock blk;
- ssize_t consumed = 0;
-
- for (blk = TSIOBufferReaderStart(reader); blk; blk = TSIOBufferBlockNext(blk)) {
- const char *ptr;
- const char *end;
- int64_t nbytes;
- TSParseResult result;
-
- ptr = TSIOBufferBlockReadStart(blk, reader, &nbytes);
- if (ptr == nullptr || nbytes == 0) {
- continue;
- }
-
- end = ptr + nbytes;
- result = TSHttpHdrParseResp(parser, mbuffer.get(), header.get(), &ptr, end);
- switch (result) {
- case TS_PARSE_ERROR:
- return (ssize_t)result;
- case TS_PARSE_DONE:
- case TS_PARSE_OK:
- this->complete = true;
- case TS_PARSE_CONT:
- // We consumed the buffer we got minus the remainder.
- consumed += (nbytes - std::distance(ptr, end));
- }
-
- if (this->complete) {
- break;
- }
- }
-
- TSIOBufferReaderConsume(reader, consumed);
- return consumed;
-}
-
-static void
-make_ts_http_url(TSMBuffer buffer, TSMLoc header, const spdy::key_value_block &kvblock)
-{
- TSReturnCode tstatus;
- TSMLoc url;
-
- tstatus = TSHttpHdrUrlGet(buffer, header, &url);
- if (tstatus == TS_ERROR) {
- tstatus = TSUrlCreate(buffer, &url);
- }
-
- TSUrlSchemeSet(buffer, url, kvblock.url().scheme.data(), kvblock.url().scheme.size());
- TSUrlHostSet(buffer, url, kvblock.url().hostport.data(), kvblock.url().hostport.size());
- TSUrlPathSet(buffer, url, kvblock.url().path.data(), kvblock.url().path.size());
- TSHttpHdrMethodSet(buffer, header, kvblock.url().method.data(), kvblock.url().method.size());
-
- TSHttpHdrUrlSet(buffer, header, url);
-
- TSAssert(tstatus == TS_SUCCESS);
-}
-
-static TSMLoc
-make_ts_http_header(TSMBuffer buffer, const spdy::key_value_block &kvblock)
-{
- scoped_http_header header(buffer);
-
- TSHttpHdrTypeSet(buffer, header, TS_HTTP_TYPE_REQUEST);
-
- // XXX extract the real HTTP version header from kvblock.url()
- TSHttpHdrVersionSet(buffer, header, TS_HTTP_VERSION(1, 1));
- make_ts_http_url(buffer, header, kvblock);
-
- // Duplicate the header fields into the MIME header for the HTTP request we
- // are building.
- for (auto ptr(kvblock.begin()); ptr != kvblock.end(); ++ptr) {
- if (ptr->first[0] != ':') {
- TSMLoc field;
-
- // XXX Need special handling for duplicate headers; we should
- // append them as a multi-value
-
- TSMimeHdrFieldCreateNamed(buffer, header, ptr->first.c_str(), -1, &field);
- TSMimeHdrFieldValueStringInsert(buffer, header, field, -1, ptr->second.c_str(), -1);
- TSMimeHdrFieldAppend(buffer, header, field);
- }
- }
-
- return header.release();
-}
-
-scoped_http_header::scoped_http_header(TSMBuffer b, const spdy::key_value_block &kvblock) : buffer(b)
-{
- this->header = make_ts_http_header(buffer, kvblock);
-}
-
-scoped_http_header::scoped_http_header(TSMBuffer b) : header(TS_NULL_MLOC), buffer(b)
-{
- header = TSHttpHdrCreate(buffer);
-}
-
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/http.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/http.h b/plugins/experimental/spdy/http.h
deleted file mode 100644
index 0202a24..0000000
--- a/plugins/experimental/spdy/http.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef HTTP_H_E7A06C65_4FCF_46C0_8C97_455BEB9A3DE8
-#define HTTP_H_E7A06C65_4FCF_46C0_8C97_455BEB9A3DE8
-
-struct spdy_io_stream;
-namespace spdy
-{
-struct key_value_block;
-}
-
-// Send a HTTP error response on the given SPDY stream.
-void http_send_error(spdy_io_stream *, TSHttpStatus);
-
-// Send a HTTP response (HTTP header + MIME headers).
-void http_send_response(spdy_io_stream *, TSMBuffer, TSMLoc);
-
-// Send a chunk of the HTTP body content.
-void http_send_content(spdy_io_stream *, TSIOBufferReader);
-
-void debug_http_header(const spdy_io_stream *, TSMBuffer, TSMLoc);
-
-struct scoped_http_header {
- explicit scoped_http_header(TSMBuffer b);
- scoped_http_header(TSMBuffer, const spdy::key_value_block &);
-
- scoped_http_header(TSMBuffer b, TSMLoc h) : header(h), buffer(b) {}
-
- ~scoped_http_header()
- {
- if (header != TS_NULL_MLOC) {
- TSHttpHdrDestroy(buffer, header);
- TSHandleMLocRelease(buffer, TS_NULL_MLOC, header);
- }
- }
-
- operator bool() const { return buffer != nullptr && header != TS_NULL_MLOC; }
-
- operator TSMLoc() const { return header; }
-
- TSMLoc
- get()
- {
- return header;
- }
-
- TSMLoc
- release()
- {
- TSMLoc tmp = TS_NULL_MLOC;
- std::swap(tmp, header);
- return tmp;
- }
-
-private:
- TSMLoc header;
- TSMBuffer buffer;
-};
-
-struct http_parser {
- http_parser();
- ~http_parser();
-
- ssize_t parse(TSIOBufferReader);
-
- TSHttpParser parser;
- scoped_mbuffer mbuffer;
- scoped_http_header header;
- bool complete;
-};
-
-#endif /* HTTP_H_E7A06C65_4FCF_46C0_8C97_455BEB9A3DE8 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/io.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/io.cc b/plugins/experimental/spdy/io.cc
deleted file mode 100644
index 2329bdc..0000000
--- a/plugins/experimental/spdy/io.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <ts/ts.h>
-#include <spdy/spdy.h>
-#include "io.h"
-#include <memory>
-
-spdy_io_control::spdy_io_control(TSVConn v) : vconn(v), input(), output(), streams(), last_stream_id(0)
-{
-}
-
-spdy_io_control::~spdy_io_control()
-{
- TSVConnClose(vconn);
-
- for (auto ptr(streams.begin()); ptr != streams.end(); ++ptr) {
- release(ptr->second);
- }
-}
-
-void
-spdy_io_control::reenable()
-{
- TSVIO vio = TSVConnWriteVIOGet(this->vconn);
- TSMutex mutex = TSVIOMutexGet(vio);
-
- TSMutexLock(mutex);
- TSVIOReenable(vio);
- TSMutexUnlock(mutex);
-}
-
-bool
-spdy_io_control::valid_client_stream_id(unsigned stream_id) const
-{
- if (stream_id == 0) {
- return false;
- } // must not be zero
- if ((stream_id % 2) == 0) {
- return false;
- } // must be odd
- return stream_id > last_stream_id;
-}
-
-spdy_io_stream *
-spdy_io_control::create_stream(unsigned stream_id)
-{
- std::auto_ptr<spdy_io_stream> ptr(new spdy_io_stream(stream_id));
- std::pair<stream_map_type::iterator, bool> result;
-
- result = streams.insert(std::make_pair(stream_id, ptr.get()));
- if (result.second) {
- // Insert succeeded, hold a refcount on the stream.
- retain(ptr.get());
- last_stream_id = stream_id;
- return ptr.release();
- }
-
- // stream-id collision ... fail and autorelease.
- return NULL;
-}
-
-void
-spdy_io_control::destroy_stream(unsigned stream_id)
-{
- stream_map_type::iterator ptr(streams.find(stream_id));
- if (ptr != streams.end()) {
- std::lock_guard<spdy_io_stream::lock_type> lk(ptr->second->lock);
- release(ptr->second);
- streams.erase(ptr);
- }
-}
-
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/io.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/io.h b/plugins/experimental/spdy/io.h
deleted file mode 100644
index 57846f2..0000000
--- a/plugins/experimental/spdy/io.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef IO_H_C3455D48_1D3C_49C0_BB81_844F4C7946A5
-#define IO_H_C3455D48_1D3C_49C0_BB81_844F4C7946A5
-
-struct spdy_io_stream;
-struct spdy_io_control;
-struct http_parser;
-
-template <typename T, T (*Alloc)(void), TSReturnCode (*Destroy)(T)> struct scoped_ts_object {
- scoped_ts_object() : ts(Alloc()) {}
-
- ~scoped_ts_object()
- {
- if (ts) {
- Destroy(ts);
- }
- }
-
- T
- get() const
- {
- return ts;
- }
-
- T
- release()
- {
- T tmp(nullptr);
- std::swap(ts, tmp);
- return tmp;
- }
-
-private:
- T ts;
-};
-
-typedef scoped_ts_object<TSMBuffer, TSMBufferCreate, TSMBufferDestroy> scoped_mbuffer;
-
-template <> std::string stringof<TSEvent>(const TSEvent &);
-
-#include <base/atomic.h>
-#include "http.h"
-
-struct spdy_io_buffer {
- TSIOBuffer buffer;
- TSIOBufferReader reader;
-
- spdy_io_buffer()
- {
- buffer = TSIOBufferCreate();
- reader = TSIOBufferReaderAlloc(buffer);
- }
-
- ~spdy_io_buffer()
- {
- TSIOBufferReaderFree(reader);
- TSIOBufferDestroy(buffer);
- }
-
- void
- consume(size_t nbytes)
- {
- TSIOBufferReaderConsume(reader, nbytes);
- }
-
- void
- watermark(size_t nbytes)
- {
- TSIOBufferWaterMarkSet(buffer, nbytes);
- }
-};
-
-struct spdy_io_stream : public countable {
- enum http_state_type : unsigned {
- http_resolve_host = 0x0001,
- http_send_headers = 0x0002,
- http_receive_headers = 0x0004,
- http_send_content = 0x0008,
- http_receive_content = 0x0010,
- http_closed = 0x0020
- };
-
- enum open_options : unsigned {
- open_none = 0x0000,
- open_with_system_resolver = 0x0001,
- };
-
- explicit spdy_io_stream(unsigned);
- virtual ~spdy_io_stream();
-
- // Move kv into the stream and start processing it. Return true if the
- // stream transitions to open state.
- bool open(spdy::key_value_block &, open_options);
- void close();
-
- bool
- is_closed() const
- {
- return !this->is_open();
- }
- bool
- is_open() const
- {
- return this->action || this->vconn;
- }
-
- typedef std::mutex lock_type;
-
- unsigned stream_id;
- unsigned http_state;
-
- // NOTE: The caller *must* hold the stream lock when calling open() or
- // close(), or processing any stream events.
- lock_type lock;
-
- spdy::protocol_version version;
- TSAction action;
- TSVConn vconn;
- TSCont continuation;
- spdy::key_value_block kvblock;
-
- spdy_io_control *io;
- spdy_io_buffer input;
- spdy_io_buffer output;
- http_parser hparser;
-
- static spdy_io_stream *
- get(TSCont contp)
- {
- return (spdy_io_stream *)TSContDataGet(contp);
- }
-};
-
-struct spdy_io_control : public countable {
- spdy_io_control(TSVConn);
- ~spdy_io_control();
-
- // TSVIOReenable() the associated TSVConnection.
- void reenable();
-
- bool valid_client_stream_id(unsigned stream_id) const;
- spdy_io_stream *create_stream(unsigned stream_id);
- void destroy_stream(unsigned stream_id);
-
- typedef std::map<unsigned, spdy_io_stream *> stream_map_type;
-
- TSVConn vconn;
- spdy_io_buffer input;
- spdy_io_buffer output;
- stream_map_type streams;
- unsigned last_stream_id;
-
- spdy::zstream<spdy::compress> compressor;
- spdy::zstream<spdy::decompress> decompressor;
-
- static spdy_io_control *
- get(TSCont contp)
- {
- return (spdy_io_control *)TSContDataGet(contp);
- }
-};
-
-#endif /* IO_H_C3455D48_1D3C_49C0_BB81_844F4C7946A5 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/base/atomic.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/base/atomic.h b/plugins/experimental/spdy/lib/base/atomic.h
deleted file mode 100644
index 85f8b2a..0000000
--- a/plugins/experimental/spdy/lib/base/atomic.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ATOMIC_H_A14B912F_B134_4D38_8EC1_51C50EC0FBE6
-#define ATOMIC_H_A14B912F_B134_4D38_8EC1_51C50EC0FBE6
-
-#include <mutex>
-#include <atomic>
-#include <thread>
-
-// Base mixin for reference-countable objects.
-struct countable {
- countable() : refcnt(0) {}
- virtual ~countable() {}
-
-private:
- std::atomic<unsigned> refcnt;
-
- template <typename T> friend T *retain(T *ptr);
- template <typename T> friend void release(T *ptr);
-};
-
-// Increment the reference count of a countable object, returning it.
-template <typename T>
-T *
-retain(T *ptr)
-{
- std::atomic_fetch_add_explicit(&ptr->refcnt, 1u, std::memory_order_acq_rel);
- return ptr;
-}
-
-// Decrement the reference count of a countable object, deleting it if it was
-// the last reference.
-template <typename T>
-void
-release(T *ptr)
-{
- unsigned count = std::atomic_fetch_sub_explicit(&ptr->refcnt, 1u, std::memory_order_acq_rel);
- // If the previous refcount was 1, then we have decremented it to 0. We
- // want to delete in that case.
- if (count == 1u) {
- delete ptr;
- }
-}
-
-#endif /* ATOMIC_H_A14B912F_B134_4D38_8EC1_51C50EC0FBE6 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/base/inet.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/base/inet.h b/plugins/experimental/spdy/lib/base/inet.h
deleted file mode 100644
index 7aa7186..0000000
--- a/plugins/experimental/spdy/lib/base/inet.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef INET_H_9452AE2E_D6D2_4B26_AF98_7550DC033E54
-#define INET_H_9452AE2E_D6D2_4B26_AF98_7550DC033E54
-
-#include <stdlib.h> // abort
-#include <sys/types.h>
-#include <netinet/in.h>
-
-struct inet_address {
- explicit inet_address(const struct sockaddr *addr)
- {
- switch (addr->sa_family) {
- case AF_INET:
- memcpy(&sa.storage, addr, sizeof(sockaddr_in));
- break;
- case AF_INET6:
- memcpy(&sa.storage, addr, sizeof(sockaddr_in6));
- break;
- default:
- memset(&sa, 0, sizeof(sa));
- }
- }
-
- uint16_t &
- port()
- {
- switch (sa.storage.ss_family) {
- case AF_INET:
- return sa.in.sin_port;
- case AF_INET6:
- return sa.in6.sin6_port;
- default:
- TSError("invalid inet address type %u", sa.storage.ss_family);
- abort();
- }
- }
-
- const sockaddr *
- saddr() const
- {
- return &sa.sa;
- }
-
-private:
- union {
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- struct sockaddr sa;
- struct sockaddr_storage storage;
- } sa;
-};
-
-template <>
-std::string
-stringof<inet_address>(const inet_address &inaddr)
-{
- return cstringof(*inaddr.saddr());
-}
-
-#endif /* INET_H_9452AE2E_D6D2_4B26_AF98_7550DC033E54 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/base/logging.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/base/logging.cc b/plugins/experimental/spdy/lib/base/logging.cc
deleted file mode 100644
index 2e1a4c3..0000000
--- a/plugins/experimental/spdy/lib/base/logging.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "logging.h"
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-template <>
-std::string
-stringof<struct sockaddr>(const sockaddr &sa)
-{
- char buf[INET6_ADDRSTRLEN + 1];
- union {
- const in_addr *in;
- const in6_addr *in6;
- } ptr;
-
- ptr.in = nullptr;
- switch (sa.sa_family) {
- case AF_INET:
- ptr.in = &((const sockaddr_in *)(&sa))->sin_addr;
- break;
- case AF_INET6:
- ptr.in6 = &((const sockaddr_in6 *)(&sa))->sin6_addr;
- break;
- }
-
- inet_ntop(sa.sa_family, ptr.in, buf, sizeof(buf));
- return std::string(buf);
-}
-
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/base/logging.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/base/logging.h b/plugins/experimental/spdy/lib/base/logging.h
deleted file mode 100644
index 5e50c83..0000000
--- a/plugins/experimental/spdy/lib/base/logging.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LOGGING_H_E307AFC6_4429_42F6_8E66_4004C6A78795
-#define LOGGING_H_E307AFC6_4429_42F6_8E66_4004C6A78795
-
-#include <string>
-
-extern "C" {
-
-// TS logging APIs don't get format attributes, so make sure we have a
-// compatible forward declaration.
-void TSDebug(const char *, const char *, ...) __attribute__((format(printf, 2, 3)));
-
-void TSError(const char *, ...) __attribute__((format(printf, 1, 2)));
-
-int TSIsDebugTagSet(const char *);
-}
-
-template <typename T> std::string stringof(const T &);
-#define cstringof(x) stringof(x).c_str()
-
-#define debug_tag(tag, fmt, ...) \
- do { \
- if (unlikely(TSIsDebugTagSet(tag))) { \
- TSDebug(tag, fmt, ##__VA_ARGS__); \
- } \
- } while (0)
-
-#define debug_protocol(fmt, ...) debug_tag("spdy.protocol", "%s:%d " fmt, __func__, __LINE__, ##__VA_ARGS__)
-#define debug_plugin(fmt, ...) debug_tag("spdy.plugin", "%s:%d " fmt, __func__, __LINE__, ##__VA_ARGS__)
-#define debug_http(fmt, ...) debug_tag("spdy.http", "%s:%d " fmt, __func__, __LINE__, ##__VA_ARGS__)
-
-// Internal logging helpers
-namespace detail
-{
-template <typename T> struct named_value {
- const char *name;
- T value;
-};
-
-template <typename T, unsigned N>
-const char *
-match(const named_value<T>(&names)[N], const T &value)
-{
- for (unsigned i = 0; i < N; ++i) {
- if (names[i].value == value) {
- return names[i].name;
- }
- }
-
- return "";
-}
-}
-
-#endif /* LOGGING_H_E307AFC6_4429_42F6_8E66_4004C6A78795 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/spdy/message.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/spdy/message.cc b/plugins/experimental/spdy/lib/spdy/message.cc
deleted file mode 100644
index eb24d41..0000000
--- a/plugins/experimental/spdy/lib/spdy/message.cc
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "spdy.h"
-#include "zstream.h"
-#include <base/logging.h>
-
-#include <stdexcept>
-#include <vector>
-#include <map>
-#include <algorithm>
-#include <functional>
-#include <string.h>
-#include <arpa/inet.h>
-
-template <>
-std::string
-stringof<spdy::control_frame_type>(const spdy::control_frame_type &ev)
-{
- static const detail::named_value<unsigned> control_names[] = {{"CONTROL_SYN_STREAM", 1},
- {"CONTROL_SYN_REPLY", 2},
- {"CONTROL_RST_STREAM", 3},
- {"CONTROL_SETTINGS", 4},
- {"CONTROL_PING", 6},
- {"CONTROL_GOAWAY", 7},
- {"CONTROL_HEADERS", 8},
- {"CONTROL_WINDOW_UPDATE", 9}};
-
- return detail::match(control_names, (unsigned)ev);
-}
-
-template <>
-std::string
-stringof<spdy::error>(const spdy::error &e)
-{
- static const detail::named_value<unsigned> error_names[] = {{"PROTOCOL_ERROR", 1},
- {"INVALID_STREAM", 2},
- {"REFUSED_STREAM", 3},
- {"UNSUPPORTED_VERSION", 4},
- {"CANCEL", 5},
- {"FLOW_CONTROL_ERROR", 6},
- {"STREAM_IN_USE", 7},
- {"STREAM_ALREADY_CLOSED", 8}};
-
- return detail::match(error_names, (unsigned)e);
-}
-
-// XXX for the insert and extract we assume that the compiler uses an intrinsic
-// to inline the memcpy() calls. Need to verify this by examining the
-// assembler.
-
-template <typename T>
-T
-extract(const uint8_t *&ptr)
-{
- T val;
- memcpy(&val, ptr, sizeof(val));
- std::advance(ptr, sizeof(val));
- return val;
-}
-
-template <>
-uint8_t
-extract<uint8_t>(const uint8_t *&ptr)
-{
- return *ptr++;
-}
-
-template <typename T>
-void
-insert(const T &val, uint8_t *&ptr)
-{
- memcpy(ptr, &val, sizeof(val));
- std::advance(ptr, sizeof(val));
-}
-
-static inline uint32_t
-extract_stream_id(const uint8_t *&ptr)
-{
- return ntohl(extract<uint32_t>(ptr)) & 0x7fffffffu;
-}
-
-static inline void
-insert_stream_id(uint32_t stream_id, uint8_t *&ptr)
-{
- insert<uint32_t>(htonl(stream_id & 0x7fffffffu), ptr);
-}
-
-spdy::message_header
-spdy::message_header::parse(const uint8_t *ptr, size_t len)
-{
- message_header header;
-
- if (len < message_header::size) {
- throw protocol_error(std::string("short frame header"));
- }
-
- header.is_control = ((*ptr) & 0x80u) ? true : false;
- if (header.is_control) {
- uint32_t val;
- header.control.version = ntohs(extract<uint16_t>(ptr)) & 0x7fffu;
- header.control.type = (control_frame_type)ntohs(extract<uint16_t>(ptr));
- val = ntohl(extract<uint32_t>(ptr));
- header.flags = (val >> 24);
- header.datalen = (val & 0x00ffffffu);
- } else {
- uint32_t val;
- header.data.stream_id = extract_stream_id(ptr);
- val = ntohl(extract<uint32_t>(ptr));
- header.flags = (val >> 24);
- header.datalen = (val & 0x00ffffffu);
- }
-
- return header;
-}
-
-size_t
-spdy::message_header::marshall(const message_header &msg, uint8_t *ptr, size_t len)
-{
- if (len < message_header::size) {
- throw protocol_error(std::string("short message_header buffer"));
- }
-
- if (msg.is_control) {
- insert<uint16_t>(htons(0x8000u | msg.control.version), ptr);
- insert<uint16_t>(htons(msg.control.type), ptr);
- insert<uint32_t>(htonl((msg.flags << 24) | (msg.datalen & 0x00ffffffu)), ptr);
- } else {
- insert_stream_id(msg.data.stream_id, ptr);
- insert<uint32_t>(htonl((msg.flags << 24) | (msg.datalen & 0x00ffffffu)), ptr);
- }
-
- return message_header::size;
-}
-
-spdy::syn_stream_message
-spdy::syn_stream_message::parse(const uint8_t *ptr, size_t len)
-{
- syn_stream_message msg;
-
- if (len < syn_stream_message::size) {
- throw protocol_error(std::string("short syn_stream message"));
- }
-
- msg.stream_id = extract_stream_id(ptr);
- msg.associated_id = extract_stream_id(ptr);
- msg.priority = extract<uint8_t>(ptr) >> 5; // top 3 bits are priority
- (void)extract<uint8_t>(ptr); // skip unused byte
- return msg;
-}
-
-spdy::goaway_message
-spdy::goaway_message::parse(const uint8_t *ptr, size_t len)
-{
- goaway_message msg;
-
- if (len < goaway_message::size) {
- throw protocol_error(std::string("short goaway_stream message"));
- }
-
- msg.last_stream_id = extract_stream_id(ptr);
- msg.status_code = extract_stream_id(ptr);
- return msg;
-}
-
-spdy::rst_stream_message
-spdy::rst_stream_message::parse(const uint8_t *ptr, size_t len)
-{
- rst_stream_message msg;
-
- if (len < rst_stream_message::size) {
- throw protocol_error(std::string("short rst_stream message"));
- }
-
- msg.stream_id = extract_stream_id(ptr);
- msg.status_code = extract_stream_id(ptr);
- return msg;
-}
-
-size_t
-spdy::rst_stream_message::marshall(const rst_stream_message &msg, uint8_t *ptr, size_t len)
-{
- if (len < rst_stream_message::size) {
- throw protocol_error(std::string("short rst_stream buffer"));
- }
-
- insert_stream_id(msg.stream_id, ptr);
- insert<uint32_t>(msg.status_code, ptr);
- return rst_stream_message::size;
-}
-
-size_t
-spdy::syn_reply_message::marshall(protocol_version version, const syn_reply_message &msg, uint8_t *ptr, size_t len)
-{
- if (len < size(version)) {
- throw protocol_error(std::string("short syn_reply buffer"));
- }
-
- if (version < PROTOCOL_VERSION_3) {
- // SPDYv2 has 2 extraneous bytes at the end. How nice that the SPDYv2
- // spec is no longer on the internets.
- insert_stream_id(msg.stream_id, ptr);
- insert<uint16_t>(0, ptr);
- } else {
- insert_stream_id(msg.stream_id, ptr);
- }
-
- return size(version);
-}
-
-// +------------------------------------+
-// | Number of Name/Value pairs (int32) |
-// +------------------------------------+
-// | Length of name (int32) |
-// +------------------------------------+
-// | Name (string) |
-// +------------------------------------+
-// | Length of value (int32) |
-// +------------------------------------+
-// | Value (string) |
-// +------------------------------------+
-// | (repeats) |
-
-static spdy::zstream_error
-decompress_headers(spdy::zstream<spdy::decompress> &decompressor, std::vector<uint8_t> &bytes)
-{
- ssize_t nbytes;
-
- do {
- size_t avail;
- size_t old = bytes.size();
- bytes.resize(bytes.size() + getpagesize());
- avail = bytes.size() - old;
- nbytes = decompressor.consume(&bytes[old], avail);
- if (nbytes > 0) {
- bytes.resize(old + nbytes);
- } else {
- bytes.resize(old);
- }
- } while (nbytes > 0);
-
- if (nbytes < 0) {
- return (spdy::zstream_error)(-nbytes);
- }
-
- return spdy::z_ok;
-}
-
-static ssize_t
-marshall_string_v2(spdy::zstream<spdy::compress> &compressor, const std::string &strval, uint8_t *ptr, size_t len, unsigned flags)
-{
- size_t nbytes = 0;
- ssize_t status;
- uint16_t tmp16;
-
- tmp16 = htons(strval.size());
- compressor.input(&tmp16, sizeof(tmp16));
- status = compressor.consume(ptr + nbytes, len - nbytes, flags);
- if (status < 0) {
- return status;
- }
-
- nbytes += status;
-
- compressor.input(strval.c_str(), strval.size());
- status = compressor.consume(ptr + nbytes, len - nbytes, flags);
- if (status < 0) {
- return status;
- }
-
- nbytes += status;
- return nbytes;
-}
-
-static ssize_t
-marshall_name_value_pairs_v2(spdy::zstream<spdy::compress> &compressor, const spdy::key_value_block &kvblock, uint8_t *ptr,
- size_t len)
-{
- size_t nbytes = 0;
- ssize_t status;
- uint16_t tmp16;
-
- tmp16 = htons(kvblock.size());
- compressor.input(&tmp16, sizeof(tmp16));
- status = compressor.consume(ptr + nbytes, len - nbytes, 0);
- if (status < 0) {
- return status;
- }
-
- nbytes += status;
-
- for (auto kv(kvblock.begin()); kv != kvblock.end(); ++kv) {
- status = marshall_string_v2(compressor, kv->first, ptr + nbytes, len - nbytes, 0);
- if (status < 0) {
- return status;
- }
-
- nbytes += status;
-
- status = marshall_string_v2(compressor, kv->second, ptr + nbytes, len - nbytes, 0);
- if (status < 0) {
- return status;
- }
-
- nbytes += status;
- }
-
- do {
- status = compressor.consume(ptr + nbytes, len - nbytes, Z_SYNC_FLUSH);
- if (status < 0) {
- return status;
- }
- nbytes += status;
- } while (status != 0);
-
- return nbytes;
-}
-
-static spdy::key_value_block
-parse_name_value_pairs_v2(const uint8_t *ptr, size_t len)
-{
- int32_t npairs;
- const uint8_t *end = ptr + len;
-
- spdy::key_value_block kvblock;
-
- if (len < sizeof(int32_t)) {
- // XXX throw
- }
-
- npairs = ntohs(extract<int16_t>(ptr));
- if (npairs < 1) {
- //
- }
-
- while (npairs--) {
- std::string key;
- std::string val;
- int32_t nbytes;
-
- if (std::distance(ptr, end) < 8) {
- // XXX
- }
-
- nbytes = ntohs(extract<uint16_t>(ptr));
- if (std::distance(ptr, end) < nbytes) {
- // XXX
- }
-
- key.assign((const char *)ptr, nbytes);
- std::advance(ptr, nbytes);
-
- nbytes = ntohs(extract<uint16_t>(ptr));
- if (std::distance(ptr, end) < nbytes) {
- // XXX
- }
-
- val.assign((const char *)ptr, nbytes);
- std::advance(ptr, nbytes);
-
- // XXX Extract this assignment section into a lambda. This would let us
- // parse the kvblock into a key_value_block, or straight into the
- // corresponding ATS data structures.
- if (key == "host") {
- kvblock.url().hostport = val;
- } else if (key == "scheme") {
- kvblock.url().scheme = val;
- } else if (key == "url") {
- kvblock.url().path = val;
- } else if (key == "method") {
- kvblock.url().method = val;
- } else if (key == "version") {
- kvblock.url().version = val;
- } else {
- kvblock.headers[key] = val;
- }
- }
-
- return kvblock;
-}
-
-spdy::key_value_block
-spdy::key_value_block::parse(protocol_version version, zstream<decompress> &decompressor, const uint8_t *ptr, size_t len)
-{
- std::vector<uint8_t> bytes;
- key_value_block kvblock;
-
- if (version != PROTOCOL_VERSION_2) {
- // XXX support v3 and throw a proper damn error.
- throw std::runtime_error("unsupported version");
- }
-
- decompressor.input(ptr, len);
- if (decompress_headers(decompressor, bytes) != z_ok) {
- // XXX
- }
-
- return parse_name_value_pairs_v2(&bytes[0], bytes.size());
-}
-
-size_t
-spdy::key_value_block::marshall(protocol_version version, spdy::zstream<compress> &compressor, const key_value_block &kvblock,
- uint8_t *ptr, size_t len)
-{
- ssize_t nbytes;
-
- if (version != PROTOCOL_VERSION_2) {
- // XXX support v3 and throw a proper damn error.
- throw std::runtime_error("unsupported version");
- }
-
- nbytes = marshall_name_value_pairs_v2(compressor, kvblock, ptr, len);
- if (nbytes < 0) {
- throw std::runtime_error("marshalling failure");
- }
-
- return nbytes;
-}
-
-size_t
-spdy::key_value_block::nbytes(protocol_version version) const
-{
- size_t nbytes = 0;
- size_t lensz;
-
- // Length fields are 2 bytes in SPDYv2 and 4 in later versions.
- switch (version) {
- case PROTOCOL_VERSION_3:
- lensz = 4;
- break;
- case PROTOCOL_VERSION_2:
- lensz = 2;
- break;
- default:
- throw std::runtime_error("unsupported version");
- }
-
- nbytes += lensz;
- for (auto ptr(begin()); ptr != end(); ++ptr) {
- nbytes += lensz + ptr->first.size();
- nbytes += lensz + ptr->second.size();
- }
-
- return nbytes;
-}
-
-struct lowercase : public std::unary_function<char, char> {
- char operator()(char c) const
- {
- // Return the lowercase ASCII only if it's in the uppercase
- // ASCII range.
- if (c > 0x40 && c < 0x5b) {
- return c + 0x20;
- }
-
- return c;
- }
-};
-
-void
-spdy::key_value_block::insert(std::string key, std::string value)
-{
- std::transform(key.begin(), key.end(), key.begin(), lowercase());
- headers[key] = value;
-}
-
-spdy::ping_message
-spdy::ping_message::parse(const uint8_t *ptr, size_t len)
-{
- ping_message msg;
-
- if (len < ping_message::size) {
- throw protocol_error(std::string("short ping message"));
- }
-
- msg.ping_id = ntohl(extract<uint32_t>(ptr));
- return msg;
-}
-
-size_t
-spdy::ping_message::marshall(const ping_message &msg, uint8_t *ptr, size_t len)
-{
- if (len < ping_message::size) {
- throw protocol_error(std::string("short ping_message buffer"));
- }
-
- insert<uint32_t>(htonl(msg.ping_id), ptr);
- return ping_message::size;
-}
-
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/spdy/spdy.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/spdy/spdy.h b/plugins/experimental/spdy/lib/spdy/spdy.h
deleted file mode 100644
index 99d01b7..0000000
--- a/plugins/experimental/spdy/lib/spdy/spdy.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef SPDY_H_57211D6A_F320_42E3_8205_89E651B4A5DB
-#define SPDY_H_57211D6A_F320_42E3_8205_89E651B4A5DB
-
-#include <inttypes.h>
-#include <stddef.h>
-#include <stdexcept>
-#include <string>
-#include <map>
-
-#include "zstream.h"
-
-namespace spdy
-{
-enum protocol_version : unsigned {
- PROTOCOL_VERSION_2 = 2,
- PROTOCOL_VERSION_3 = 3,
-};
-
-enum : unsigned {
- PROTOCOL_VERSION = 3,
- MAX_FRAME_LENGTH = (1u << 24),
-};
-
-enum : unsigned {
- FLAG_FIN = 1,
- FLAG_COMPRESSED = 2,
-};
-
-struct protocol_error : public std::runtime_error {
- explicit protocol_error(const std::string &msg) : std::runtime_error(msg) {}
-};
-
-enum control_frame_type : unsigned {
- CONTROL_SYN_STREAM = 1,
- CONTROL_SYN_REPLY = 2,
- CONTROL_RST_STREAM = 3,
- CONTROL_SETTINGS = 4,
- CONTROL_PING = 6,
- CONTROL_GOAWAY = 7,
- CONTROL_HEADERS = 8,
- CONTROL_WINDOW_UPDATE = 9
-};
-
-
-enum error : unsigned {
- PROTOCOL_ERROR = 1,
- INVALID_STREAM = 2,
- REFUSED_STREAM = 3,
- UNSUPPORTED_VERSION = 4,
- CANCEL = 5,
- FLOW_CONTROL_ERROR = 6,
- STREAM_IN_USE = 7,
- STREAM_ALREADY_CLOSED = 8
-};
-
-// Control frame header:
-// +----------------------------------+
-// |C| Version(15bits) | Type(16bits) |
-// +----------------------------------+
-// | Flags (8) | Length (24 bits) |
-// +----------------------------------+
-// | Data |
-// +----------------------------------+
-//
-// Data frame header:
-// +----------------------------------+
-// |C| Stream-ID (31bits) |
-// +----------------------------------+
-// | Flags (8) | Length (24 bits) |
-// +----------------------------------+
-// | Data |
-// +----------------------------------+
-
-struct message_header {
- union {
- struct {
- unsigned version;
- control_frame_type type;
- } control;
- struct {
- unsigned stream_id;
- } data;
- };
-
- bool is_control;
- uint8_t flags;
- uint32_t datalen;
-
- static message_header parse(const uint8_t *, size_t);
- static size_t marshall(const message_header &, uint8_t *, size_t);
- enum : unsigned {
- size = 8,
- }; /* bytes */
-};
-
-// SYN_STREAM frame:
-//
-// +------------------------------------+
-// |1| version | 1 |
-// +------------------------------------+
-// | Flags (8) | Length (24 bits) |
-// +------------------------------------+
-// |X| Stream-ID (31bits) |
-// +------------------------------------+
-// |X| Associated-To-Stream-ID (31bits) |
-// +------------------------------------+
-// | Pri | Unused | Header Count(int16)|
-// +------------------------------------+ <+
-// | Length of name (int32) | | This section is the "Name/Value
-// +------------------------------------+ | Header Block", and is compressed.
-// | Name (string) | |
-// +------------------------------------+ |
-// | Length of value (int32) | |
-// +------------------------------------+ |
-// | Value (string) | |
-// +------------------------------------+ |
-// | (repeats) | <+
-
-struct syn_stream_message {
- unsigned stream_id;
- unsigned associated_id;
- unsigned priority;
- unsigned header_count;
-
- static syn_stream_message parse(const uint8_t *, size_t);
- enum : unsigned {
- size = 10,
- }; /* bytes */
-};
-
-// SYN_REPLY frame:
-//
-// +------------------------------------+
-// |1| version | 2 |
-// +------------------------------------+
-// | Flags (8) | Length (24 bits) |
-// +------------------------------------+
-// |X| Stream-ID (31bits) |
-// +------------------------------------+
-// | Number of Name/Value pairs (int32) | <+
-// +------------------------------------+ |
-// | Length of name (int32) | | This section is the "Name/Value
-// +------------------------------------+ | Header Block", and is compressed.
-// | Name (string) | |
-// +------------------------------------+ |
-// | Length of value (int32) | |
-// +------------------------------------+ |
-// | Value (string) | |
-// +------------------------------------+ |
-// | (repeats) | <+
-
-struct syn_reply_message {
- unsigned stream_id;
-
- static syn_stream_message parse(const uint8_t *, size_t);
- static size_t marshall(protocol_version, const syn_reply_message &, uint8_t *, size_t);
-
- static unsigned
- size(protocol_version v)
- {
- return (v == PROTOCOL_VERSION_2) ? 6 : 4; /* bytes */
- }
-};
-
-// GOAWAY frame:
-//
-// +----------------------------------+
-// |1| version | 7 |
-// +----------------------------------+
-// | 0 (flags) | 8 (length) |
-// +----------------------------------|
-// |X| Last-good-stream-ID (31 bits) |
-// +----------------------------------+
-// | Status code |
-// +----------------------------------+
-
-struct goaway_message {
- unsigned last_stream_id;
- unsigned status_code;
-
- static goaway_message parse(const uint8_t *, size_t);
- enum : unsigned {
- size = 8,
- }; /* bytes */
-};
-
-struct rst_stream_message {
- unsigned stream_id;
- unsigned status_code;
-
- static rst_stream_message parse(const uint8_t *, size_t);
- static size_t marshall(const rst_stream_message &, uint8_t *, size_t);
- enum : unsigned {
- size = 8,
- }; /* bytes */
-};
-
-struct ping_message {
- unsigned ping_id;
-
- static ping_message parse(const uint8_t *, size_t);
- static size_t marshall(const ping_message &, uint8_t *, size_t);
- enum : unsigned {
- size = 4,
- }; /* bytes */
-};
-
-struct url_components {
- std::string method;
- std::string scheme;
- std::string hostport;
- std::string path;
- std::string version;
-
- bool
- is_complete() const
- {
- return !(method.empty() && scheme.empty() && hostport.empty() && path.empty() && version.empty());
- }
-};
-
-struct key_value_block {
- typedef std::map<std::string, std::string> map_type;
- typedef map_type::const_iterator const_iterator;
- typedef map_type::iterator iterator;
-
- map_type::size_type
- size() const
- {
- return headers.size();
- }
-
- bool
- exists(const std::string &key) const
- {
- return headers.find(key) != headers.end();
- }
-
- // Insert the lower-cased key.
- void insert(std::string key, std::string value);
-
- std::string &operator[](const std::string &key) { return headers[key]; }
-
- const std::string &operator[](const std::string &key) const { return headers[key]; }
-
- // Return the number of marshalling bytes this kvblock needs.
- size_t nbytes(protocol_version) const;
-
- const_iterator
- begin() const
- {
- return headers.begin();
- }
- const_iterator
- end() const
- {
- return headers.end();
- }
-
- url_components &
- url()
- {
- return components;
- }
- const url_components &
- url() const
- {
- return components;
- }
-
- url_components components;
- mutable /* XXX */ map_type headers;
-
- static key_value_block parse(protocol_version, zstream<decompress> &, const uint8_t *, size_t);
- static size_t marshall(protocol_version, zstream<compress> &, const key_value_block &, uint8_t *, size_t);
-};
-
-
-} // namespace spdy
-
-template <typename T> std::string stringof(const T &);
-
-template <> std::string stringof<spdy::control_frame_type>(const spdy::control_frame_type &);
-
-template <> std::string stringof<spdy::error>(const spdy::error &);
-
-#endif /* SPDY_H_57211D6A_F320_42E3_8205_89E651B4A5DB */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/spdy/zstream.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/spdy/zstream.cc b/plugins/experimental/spdy/lib/spdy/zstream.cc
deleted file mode 100644
index e601a12..0000000
--- a/plugins/experimental/spdy/lib/spdy/zstream.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "zstream.h"
-
-namespace spdy
-{
-const uint8_t dictionary[] = "optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-"
- "languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi"
- "f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser"
- "-agent10010120020120220320420520630030130230330430530630740040140240340440"
- "5406407408409410411412413414415416417500501502503504505accept-rangesageeta"
- "glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic"
- "ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran"
- "sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati"
- "oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo"
- "ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe"
- "pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic"
- "ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1"
- ".1statusversionurl";
-
-#if NOTYET
-unsigned long
-dictionary_id()
-{
- unsigned long id;
-
- id = adler32(0L, Z_NULL, 0);
- id = adler32(id, dictionary, sizeof(dictionary));
- return id;
-}
-#endif
-
-static zstream_error
-map_zerror(int error)
-{
- const zstream_error z_errors[] = {
- z_version_error, // Z_VERSION_ERROR (-6)
- z_buffer_error, // Z_BUF_ERROR (-5)
- z_memory_error, // Z_MEM_ERROR (-4)
- z_data_error, // Z_DATA_ERROR (-3)
- z_stream_error, // Z_STREAM_ERROR (-2)
- z_errno, // Z_ERRNO (-1)
- z_ok, // Z_OK ( 0)
- z_stream_end, // Z_STREAM_END ( 1)
- z_need_dict // Z_NEED_DICT ( 2)
- };
- const zstream_error *z = &z_errors[6];
- return z[error];
-}
-
-zstream_error
-decompress::init(z_stream *zstr)
-{
- return map_zerror(inflateInit(zstr));
-}
-
-zstream_error
-decompress::transact(z_stream *zstr, int flush)
-{
- int ret = inflate(zstr, flush);
- if (ret == Z_NEED_DICT) {
- // The spec says that the trailing NULL is not included in the
- // dictionary, but in practice, Chrome does include it.
- ret = inflateSetDictionary(zstr, dictionary, sizeof(dictionary));
- if (ret == Z_OK) {
- ret = inflate(zstr, flush);
- }
- }
-
- return map_zerror(ret);
-}
-
-zstream_error
-decompress::destroy(z_stream *zstr)
-{
- return map_zerror(inflateEnd(zstr));
-}
-
-zstream_error
-compress::init(z_stream *zstr)
-{
- zstream_error status;
-
- status = map_zerror(deflateInit(zstr, Z_DEFAULT_COMPRESSION));
- if (status != z_ok) {
- return status;
- }
-
- return map_zerror(deflateSetDictionary(zstr, dictionary, sizeof(dictionary)));
-}
-
-zstream_error
-compress::transact(z_stream *zstr, int flush)
-{
- int ret = deflate(zstr, flush);
- if (ret == Z_NEED_DICT) {
- ret = deflateSetDictionary(zstr, dictionary, sizeof(dictionary));
- if (ret == Z_OK) {
- ret = deflate(zstr, flush);
- }
- }
-
- return map_zerror(ret);
-}
-
-zstream_error
-compress::destroy(z_stream *zstr)
-{
- return map_zerror(deflateEnd(zstr));
-}
-
-} // namespace spdy
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/lib/spdy/zstream.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/lib/spdy/zstream.h b/plugins/experimental/spdy/lib/spdy/zstream.h
deleted file mode 100644
index 8e897d6..0000000
--- a/plugins/experimental/spdy/lib/spdy/zstream.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ZSTREAM_H_EA418AC6_C57B_4597_9748_7C11D04B6586
-#define ZSTREAM_H_EA418AC6_C57B_4597_9748_7C11D04B6586
-
-#include <inttypes.h>
-#include <zlib.h>
-#include <string.h>
-
-namespace spdy
-{
-enum zstream_error {
- z_ok = 0,
- z_stream_end,
- z_need_dict,
- z_errno,
- z_stream_error,
- z_data_error,
- z_memory_error,
- z_buffer_error,
- z_version_error
-};
-
-template <typename ZlibMechanism> struct zstream : public ZlibMechanism {
- zstream()
- {
- memset(&stream, 0, sizeof(stream));
- stream.zalloc = Z_NULL;
- stream.zfree = Z_NULL;
- stream.opaque = Z_NULL;
- ZlibMechanism::init(&stream);
- }
-
- bool
- drained() const
- {
- return stream.avail_in == 0;
- }
-
- template <typename T, typename N>
- void
- input(T *ptr, N nbytes)
- {
- stream.next_in = (uint8_t *)ptr;
- stream.avail_in = nbytes;
- }
-
- // Consume the input without producing any output.
- zstream_error
- consume()
- {
- zstream_error ret;
- stream.next_out = (uint8_t *)1;
- stream.avail_out = 0;
- ret = ZlibMechanism::transact(&stream, 0);
- return (ret == z_buffer_error) ? z_ok : ret;
- }
-
- // Return the number of output bytes or negative zstream_error on failure.
- template <typename T, typename N>
- ssize_t
- consume(T *ptr, N nbytes, unsigned flags = Z_SYNC_FLUSH)
- {
- zstream_error ret;
- stream.next_out = (uint8_t *)ptr;
- stream.avail_out = nbytes;
-
- ret = ZlibMechanism::transact(&stream, flags);
- if (ret == z_buffer_error) {
- return 0;
- }
-
- if (ret == z_ok || ret == z_stream_end) {
- // return the number of bytes produced
- return nbytes - stream.avail_out;
- }
-
- return -ret;
- }
-
- ~zstream() { ZlibMechanism::destroy(&stream); }
-
-private:
- zstream(const zstream &); // disable
- zstream &operator=(const zstream &); // disable
-
- z_stream stream;
-};
-
-struct decompress {
- zstream_error init(z_stream *zstr);
- zstream_error transact(z_stream *zstr, int flush);
- zstream_error destroy(z_stream *zstr);
-};
-
-struct compress {
- zstream_error init(z_stream *zstr);
- zstream_error transact(z_stream *zstr, int flush);
- zstream_error destroy(z_stream *zstr);
-};
-
-} // namespace spdy
-
-#endif /* ZSTREAM_H_EA418AC6_C57B_4597_9748_7C11D04B6586 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/protocol.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/protocol.cc b/plugins/experimental/spdy/protocol.cc
deleted file mode 100644
index dc5c2b3..0000000
--- a/plugins/experimental/spdy/protocol.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// protocol.cc - Low level routines to write SPDY frames.
-
-#include <ts/ts.h>
-#include <spdy/spdy.h>
-#include <base/logging.h>
-#include "io.h"
-#include "protocol.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "ink_defs.h" // MAX
-
-void
-spdy_send_reset_stream(spdy_io_control *io, unsigned stream_id, spdy::error status)
-{
- spdy::message_header hdr;
- spdy::rst_stream_message rst;
-
- uint8_t buffer[spdy::message_header::size + spdy::rst_stream_message::size];
- uint8_t *ptr = buffer;
- size_t nbytes = 0;
-
- hdr.is_control = true;
- hdr.control.version = spdy::PROTOCOL_VERSION;
- hdr.control.type = spdy::CONTROL_RST_STREAM;
- hdr.flags = 0;
- hdr.datalen = spdy::rst_stream_message::size;
- rst.stream_id = stream_id;
- rst.status_code = status;
-
- nbytes += spdy::message_header::marshall(hdr, ptr, sizeof(buffer));
- nbytes += spdy::rst_stream_message::marshall(rst, ptr, sizeof(buffer) - nbytes);
-
- debug_protocol("[%p/%u] sending %s stream %u with error %s", io, stream_id, cstringof(hdr.control.type), stream_id,
- cstringof(status));
- TSIOBufferWrite(io->output.buffer, buffer, nbytes);
-}
-
-void
-spdy_send_syn_reply(spdy_io_stream *stream, const spdy::key_value_block &kvblock)
-{
- union {
- spdy::message_header hdr;
- spdy::syn_reply_message syn;
- } msg;
-
- uint8_t buffer[MAX((unsigned)spdy::message_header::size, (unsigned)spdy::syn_stream_message::size)];
- size_t nbytes = 0;
-
- std::vector<uint8_t> hdrs;
-
- // Compress the kvblock into a temp buffer before we start. We need to know
- // the size of this so we can fill in the datalen field. Since there's no
- // way to go back and rewrite the data length into the TSIOBuffer, we need
- // to use a temporary copy.
- hdrs.resize(kvblock.nbytes(stream->version));
- nbytes = spdy::key_value_block::marshall(stream->version, stream->io->compressor, kvblock, &hdrs[0], hdrs.capacity());
- hdrs.resize(nbytes);
-
- msg.hdr.is_control = true;
- msg.hdr.control.version = stream->version;
- msg.hdr.control.type = spdy::CONTROL_SYN_REPLY;
- msg.hdr.flags = 0;
- msg.hdr.datalen = spdy::syn_reply_message::size(stream->version) + hdrs.size();
- nbytes = TSIOBufferWrite(stream->io->output.buffer, buffer, spdy::message_header::marshall(msg.hdr, buffer, sizeof(buffer)));
-
- msg.syn.stream_id = stream->stream_id;
- nbytes += TSIOBufferWrite(stream->io->output.buffer, buffer,
- spdy::syn_reply_message::marshall(stream->version, msg.syn, buffer, sizeof(buffer)));
-
- nbytes += TSIOBufferWrite(stream->io->output.buffer, &hdrs[0], hdrs.size());
- debug_protocol("[%p/%u] sending %s hdr.datalen=%u", stream->io, stream->stream_id, cstringof(spdy::CONTROL_SYN_REPLY),
- (unsigned)msg.hdr.datalen);
-}
-
-void
-spdy_send_data_frame(spdy_io_stream *stream, unsigned flags, const void *ptr, size_t nbytes)
-{
- spdy::message_header hdr;
- uint8_t buffer[spdy::message_header::size];
- std::vector<uint8_t> tmp;
- ssize_t ret;
-
- TSReleaseAssert(nbytes < spdy::MAX_FRAME_LENGTH);
-
- // XXX If we are compressing the data, we need to make a temporary copy.
- // When there is an ATS API that will let us rewrite the header, then we
- // can marshall straight into the TSIOBiffer.
- if (flags & spdy::FLAG_COMPRESSED) {
- tmp.resize(nbytes + 64);
- stream->io->compressor.input(ptr, nbytes);
- nbytes = 0;
-
- do {
- ret = stream->io->compressor.consume(&tmp[nbytes], tmp.size() - nbytes);
- if (ret > 0) {
- nbytes += ret;
- }
- } while (ret > 0);
-
- tmp.resize(nbytes);
- }
-
- hdr.is_control = false;
- hdr.flags = flags;
- hdr.datalen = nbytes;
- hdr.data.stream_id = stream->stream_id;
-
- spdy::message_header::marshall(hdr, buffer, sizeof(buffer));
- TSIOBufferWrite(stream->io->output.buffer, buffer, spdy::message_header::size);
-
- if (nbytes) {
- if (flags & spdy::FLAG_COMPRESSED) {
- TSIOBufferWrite(stream->io->output.buffer, &tmp[0], nbytes);
- } else {
- TSIOBufferWrite(stream->io->output.buffer, ptr, nbytes);
- }
- }
-
- debug_protocol("[%p/%u] sending DATA flags=%x hdr.datalen=%u", stream->io, stream->stream_id, flags, (unsigned)hdr.datalen);
-}
-
-void
-spdy_send_ping(spdy_io_control *io, spdy::protocol_version version, unsigned ping_id)
-{
- union {
- spdy::message_header hdr;
- spdy::ping_message ping;
- } msg;
-
- size_t nbytes = 0;
- uint8_t buffer[spdy::ping_message::size + spdy::message_header::size];
-
- msg.hdr.is_control = true;
- msg.hdr.control.version = version;
- msg.hdr.control.type = spdy::CONTROL_PING;
- msg.hdr.flags = 0;
- msg.hdr.datalen = spdy::ping_message::size;
- nbytes += spdy::message_header::marshall(msg.hdr, buffer + nbytes, sizeof(buffer) - nbytes);
-
- msg.ping.ping_id = ping_id;
- nbytes += spdy::ping_message::marshall(msg.ping, buffer + nbytes, sizeof(buffer) - nbytes);
-
- TSIOBufferWrite(io->output.buffer, buffer, nbytes);
-
- debug_protocol("[%p] sending PING id=%u", io, msg.ping.ping_id);
-}
-
-/* vim: set sw=4 tw=79 ts=4 et ai : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/protocol.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/protocol.h b/plugins/experimental/spdy/protocol.h
deleted file mode 100644
index c576880..0000000
--- a/plugins/experimental/spdy/protocol.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef PROTOCOL_H_46E29A3D_9EE6_4C4F_A355_FF42DE19EF18
-#define PROTOCOL_H_46E29A3D_9EE6_4C4F_A355_FF42DE19EF18
-
-void spdy_send_reset_stream(spdy_io_control *io, unsigned stream_id, spdy::error status);
-
-void spdy_send_syn_reply(spdy_io_stream *stream, const spdy::key_value_block &kvblock);
-
-void spdy_send_data_frame(spdy_io_stream *stream, unsigned flags, const void *ptr, size_t nbytes);
-
-void spdy_send_ping(spdy_io_control *io, spdy::protocol_version version, unsigned ping_id);
-
-#endif /* PROTOCOL_H_46E29A3D_9EE6_4C4F_A355_FF42DE19EF18 */
-/* vim: set sw=4 ts=4 tw=79 et : */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6b25aec8/plugins/experimental/spdy/spdy.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/spdy/spdy.cc b/plugins/experimental/spdy/spdy.cc
deleted file mode 100644
index c9d3b75..0000000
--- a/plugins/experimental/spdy/spdy.cc
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ts/ts.h"
-#include "ink_defs.h"
-
-#include <spdy/spdy.h>
-#include <base/logging.h>
-
-#include "io.h"
-#include "http.h"
-#include "protocol.h"
-
-#include <getopt.h>
-#include <limits>
-
-static bool use_system_resolver = false;
-
-static int spdy_vconn_io(TSCont, TSEvent, void *);
-
-static void
-recv_rst_stream(const spdy::message_header &header, spdy_io_control *io, const uint8_t *ptr)
-{
- spdy::rst_stream_message rst;
-
- rst = spdy::rst_stream_message::parse(ptr, header.datalen);
-
- debug_protocol("[%p/%u] received %s frame stream=%u status_code=%s (%u)", io, rst.stream_id, cstringof(header.control.type),
- rst.stream_id, cstringof((spdy::error)rst.status_code), rst.status_code);
-
- io->destroy_stream(rst.stream_id);
-}
-
-static void
-recv_syn_stream(const spdy::message_header &header, spdy_io_control *io, const uint8_t *ptr)
-{
- spdy::syn_stream_message syn;
- spdy_io_stream *stream;
-
- syn = spdy::syn_stream_message::parse(ptr, header.datalen);
-
- debug_protocol("[%p/%u] received %s frame stream=%u associated=%u priority=%u", io, syn.stream_id, cstringof(header.control.type),
- syn.stream_id, syn.associated_id, syn.priority);
-
- if (!io->valid_client_stream_id(syn.stream_id)) {
- debug_protocol("[%p/%u] invalid stream-id %u", io, syn.stream_id, syn.stream_id);
- spdy_send_reset_stream(io, syn.stream_id, spdy::PROTOCOL_ERROR);
- return;
- }
-
- switch (header.control.version) {
- case spdy::PROTOCOL_VERSION_2: // fallthru
- case spdy::PROTOCOL_VERSION_3:
- break;
- default:
- debug_protocol("[%p/%u] bad protocol version %d", io, syn.stream_id, header.control.version);
- spdy_send_reset_stream(io, syn.stream_id, spdy::PROTOCOL_ERROR);
- return;
- }
-
- spdy::key_value_block kvblock(spdy::key_value_block::parse((spdy::protocol_version)header.control.version, io->decompressor,
- ptr + spdy::syn_stream_message::size,
- header.datalen - spdy::syn_stream_message::size));
-
- if ((stream = io->create_stream(syn.stream_id)) == 0) {
- debug_protocol("[%p/%u] failed to create stream %u", io, syn.stream_id, syn.stream_id);
- spdy_send_reset_stream(io, syn.stream_id, spdy::INVALID_STREAM);
- return;
- }
-
- stream->io = io;
- stream->version = (spdy::protocol_version)header.control.version;
-
- if (!kvblock.url().is_complete()) {
- debug_protocol("[%p/%u] incomplete URL", io, stream->stream_id);
- // 3.2.1; missing URL, protocol error; 400 Bad Request
- http_send_error(stream, TS_HTTP_STATUS_BAD_REQUEST);
- spdy_send_reset_stream(io, stream->stream_id, spdy::CANCEL);
- io->destroy_stream(stream->stream_id);
- return;
- }
-
- spdy_io_stream::open_options options = spdy_io_stream::open_none;
- if (use_system_resolver) {
- options = spdy_io_stream::open_with_system_resolver;
- }
-
- std::lock_guard<spdy_io_stream::lock_type> lk(stream->lock);
- if (!stream->open(kvblock, options)) {
- io->destroy_stream(stream->stream_id);
- }
-}
-
-static void
-recv_ping(const spdy::message_header &header, spdy_io_control *io, const uint8_t *ptr)
-{
- spdy::ping_message ping;
-
- ping = spdy::ping_message::parse(ptr, header.datalen);
-
- debug_protocol("[%p] received PING id=%u", io, ping.ping_id);
-
- // Client must send even ping-ids. Ignore the odd ones since
- // we never send them.
- if ((ping.ping_id % 2) == 0) {
- return;
- }
-
- spdy_send_ping(io, (spdy::protocol_version)header.control.version, ping.ping_id);
-}
-
-static void
-dispatch_spdy_control_frame(const spdy::message_header &header, spdy_io_control *io, const uint8_t *ptr)
-{
- switch (header.control.type) {
- case spdy::CONTROL_SYN_STREAM:
- recv_syn_stream(header, io, ptr);
- break;
- case spdy::CONTROL_SYN_REPLY:
- case spdy::CONTROL_RST_STREAM:
- recv_rst_stream(header, io, ptr);
- break;
- case spdy::CONTROL_PING:
- recv_ping(header, io, ptr);
- break;
- case spdy::CONTROL_SETTINGS:
- case spdy::CONTROL_GOAWAY:
- case spdy::CONTROL_HEADERS:
- case spdy::CONTROL_WINDOW_UPDATE:
- debug_protocol("[%p] SPDY control frame, version=%u type=%s flags=0x%x, %u bytes", io, header.control.version,
- cstringof(header.control.type), header.flags, header.datalen);
- break;
- default:
- // SPDY 2.2.1 - MUST ignore unrecognized control frames
- TSError("[spdy] ignoring invalid control frame type %u", header.control.type);
- }
-
- io->reenable();
-}
-
-static size_t
-count_bytes_available(TSIOBufferReader reader)
-{
- TSIOBufferBlock block;
- size_t count = 0;
-
- block = TSIOBufferReaderStart(reader);
- while (block) {
- const char *ptr;
- int64_t nbytes;
-
- ptr = TSIOBufferBlockReadStart(block, reader, &nbytes);
- if (ptr && nbytes) {
- count += nbytes;
- }
-
- block = TSIOBufferBlockNext(block);
- }
-
- return count;
-}
-
-static void
-consume_spdy_frame(spdy_io_control *io)
-{
- spdy::message_header header;
- TSIOBufferBlock blk;
- const uint8_t *ptr;
- int64_t nbytes;
-
-next_frame:
-
- blk = TSIOBufferReaderStart(io->input.reader);
- ptr = (const uint8_t *)TSIOBufferBlockReadStart(blk, io->input.reader, &nbytes);
- if (!ptr) {
- // This should not fail because we only try to consume the header when
- // there are enough bytes to read the header. Experimentally, however,
- // it does fail. I wonder why.
- TSError("TSIOBufferBlockReadStart failed unexpectedly");
- return;
- }
-
- if (nbytes < spdy::message_header::size) {
- // We should never get here, because we check for space before
- // entering. Unfortunately this does happen :(
- debug_plugin("short read %" PRId64 " bytes, expected at least %u, real count %zu", nbytes, spdy::message_header::size,
- count_bytes_available(io->input.reader));
- return;
- }
-
- header = spdy::message_header::parse(ptr, (size_t)nbytes);
- TSAssert(header.datalen > 0); // XXX
-
- if (header.is_control) {
- if (header.control.version != spdy::PROTOCOL_VERSION) {
- TSError("[spdy] client is version %u, but we implement version %u", header.control.version, spdy::PROTOCOL_VERSION);
- }
- } else {
- debug_protocol("[%p] SPDY data frame, stream=%u flags=0x%x, %u bytes", io, header.data.stream_id, header.flags, header.datalen);
- }
-
- if (header.datalen >= spdy::MAX_FRAME_LENGTH) {
- // XXX puke
- }
-
- if (header.datalen <= (nbytes - spdy::message_header::size)) {
- // We have all the data in-hand ... parse it.
- io->input.consume(spdy::message_header::size);
- io->input.consume(header.datalen);
-
- ptr += spdy::message_header::size;
-
- if (header.is_control) {
- dispatch_spdy_control_frame(header, io, ptr);
- } else {
- TSError("[spdy] no data frame support yet");
- }
-
- if (TSIOBufferReaderAvail(io->input.reader) >= spdy::message_header::size) {
- goto next_frame;
- }
- }
-
- // Push the high water mark to the end of the frame so that we don't get
- // called back until we have the whole thing.
- io->input.watermark(spdy::message_header::size + header.datalen);
-}
-
-static int
-spdy_vconn_io(TSCont contp, TSEvent ev, void *edata)
-{
- TSVIO vio = (TSVIO)edata;
- int nbytes;
- spdy_io_control *io;
-
- (void)vio;
-
- // Experimentally, we recieve the read or write TSVIO pointer as the
- // callback data.
- // debug_plugin("received IO event %s, VIO=%p", cstringof(ev), vio);
-
- switch (ev) {
- case TS_EVENT_VCONN_READ_READY:
- case TS_EVENT_VCONN_READ_COMPLETE:
- io = spdy_io_control::get(contp);
- nbytes = TSIOBufferReaderAvail(io->input.reader);
- debug_plugin("received %d bytes", nbytes);
- if ((unsigned)nbytes >= spdy::message_header::size) {
- consume_spdy_frame(io);
- }
-
- // XXX frame parsing can throw. If it does, best to catch it, log it
- // and drop the connection.
- break;
- case TS_EVENT_VCONN_WRITE_READY:
- case TS_EVENT_VCONN_WRITE_COMPLETE:
- // No need to handle write events. We have already pushed all the data
- // we have into the write buffer.
- break;
- case TS_EVENT_VCONN_EOS: // fallthru
- default:
- if (ev != TS_EVENT_VCONN_EOS) {
- debug_plugin("unexpected accept event %s", cstringof(ev));
- }
- io = spdy_io_control::get(contp);
- TSVConnClose(io->vconn);
- release(io);
- }
-
- return TS_EVENT_NONE;
-}
-
-static int
-spdy_accept_io(TSCont contp, TSEvent ev, void *edata)
-{
- TSVConn vconn = (TSVConn)edata;
- ;
- spdy_io_control *io = nullptr;
-
- switch (ev) {
- case TS_EVENT_NET_ACCEPT:
- io = retain(new spdy_io_control(vconn));
- io->input.watermark(spdy::message_header::size);
- io->output.watermark(spdy::message_header::size);
- // XXX is contp leaked here?
- contp = TSContCreate(spdy_vconn_io, TSMutexCreate());
- TSContDataSet(contp, io);
- TSVConnRead(vconn, contp, io->input.buffer, std::numeric_limits<int64_t>::max());
- TSVConnWrite(vconn, contp, io->output.reader, std::numeric_limits<int64_t>::max());
- debug_protocol("accepted new SPDY session %p", io);
- break;
- default:
- debug_plugin("unexpected accept event %s", cstringof(ev));
- }
-
- return TS_EVENT_NONE;
-}
-
-static int
-spdy_setup_protocol(TSCont /* contp ATS_UNUSED */, TSEvent ev, void * /* edata ATS_UNUSED */)
-{
- switch (ev) {
- case TS_EVENT_LIFECYCLE_PORTS_INITIALIZED:
- TSReleaseAssert(TSNetAcceptNamedProtocol(TSContCreate(spdy_accept_io, TSMutexCreate()), TS_NPN_PROTOCOL_SPDY_2) == TS_SUCCESS);
- debug_plugin("registered named protocol endpoint for %s", TS_NPN_PROTOCOL_SPDY_2);
- break;
- default:
- TSError("[spdy] Protocol registration failed");
- break;
- }
-
- return TS_EVENT_NONE;
-}
-
-extern "C" void
-TSPluginInit(int argc, const char *argv[])
-{
- static const struct option longopts[] = {{const_cast<char *>("system-resolver"), no_argument, NULL, 's'}, {NULL, 0, NULL, 0}};
-
- TSPluginRegistrationInfo info;
-
- info.plugin_name = (char *)"spdy";
- info.vendor_name = (char *)"Apache Software Foundation";
- info.support_email = (char *)"dev@trafficserver.apache.org";
-
- if (TSPluginRegister(TS_SDK_VERSION_3_0, &info) != TS_SUCCESS) {
- TSError("[spdy] Plugin registration failed");
- }
-
- debug_plugin("initializing");
-
- for (;;) {
- switch (getopt_long(argc, (char *const *)argv, "s", longopts, NULL)) {
- case 's':
- use_system_resolver = true;
- break;
- case -1:
- goto init;
- default:
- TSError("[spdy] usage: spdy.so [--system-resolver]");
- }
- }
-
-init:
- TSLifecycleHookAdd(TS_LIFECYCLE_PORTS_INITIALIZED_HOOK, TSContCreate(spdy_setup_protocol, NULL));
-}
-
-/* vim: set sw=4 tw=79 ts=4 et ai : */