~~ ====================================================================
~~ 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.
~~ ====================================================================
~~ 
~~ This software consists of voluntary contributions made by many
~~ individuals on behalf of the Apache Software Foundation.  For more
~~ information on the Apache Software Foundation, please see
~~ <http://www.apache.org/>.

   -----------
   Get Involved With HttpComponents

Get Involved

   Oh shame on us... we don't really have a <Get Involved> page.
   Of course we'd like you to get involved into our project,
   but we just didn't have the time yet to explain how.

   As it happens, the ways to get involved into an open source project
   are basically the same for all projects.
   Please have a look at the
   {{{http://incubator.apache.org/guides/participation.html}
     Incubator Guide To Participation}}.
   It's terse, but has pointers to additional information elsewhere at Apache.
   The sections on participating as a User and as a Developer apply here, too.
   

