.. 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:: ../common.defs

.. _developer-guide:

Developer's Guide
*****************

This documentation is a work in progress. It was originally written for
a previous, commercially-available version of Traffic Server that
supported different operating systems and more functions than the
current version. As a result, some of the sections may refer to
functionality that no longer exists.

If you find any such issues, you may want to submit a `bug or a
patch <https://issues.apache.org/jira/secure/CreateIssue!default.jspa?pid=12310963>`__.
We also have a Wiki page explaining how to `create useful bug reports
<https://cwiki.apache.org/confluence/display/TS/Filing+useful+bug+reports>`__.
We encourage everyone to file tickets, early and often. Looking for existing,
duplicate bugs is encouraged, but not required.

.. toctree::
   :maxdepth: 2

   introduction/index.en
   release-process/index.en
   contributing/index.en
   testing-with-vagrant/index.en
   debugging/index.en
   threads-and-events.en
   cache-architecture/index.en
   logging-architecture/index.en
   internal-libraries/index.en
   plugins/index.en
   config-vars.en
   api/index.en
   continuous-integration/index.en
   documentation/index.en
   host-resolution-proposal.en
   client-session-architecture.en
   core-architecture/index.en
   design-documents/index.en
   layout/index.en
   testing/index.en
