~~ ====================================================================
~~ 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

Community

   * Users mailing list: {{{mailto:httpclient-users@hc.apache.org}httpclient-users@}} for general discussion, questions, and announcements. This is the perfect place to ask for help if you need it!

   * Development mailing list: {{{mailto:dev@hc.apache.org}dev@}} for discussion about project development.
   
   * GitHub: Star us at {{{https://github.com/apache/httpcomponents-core/}apache/httpcomponents-core}} and {{{https://github.com/apache/httpcomponents-client/}apache/httpcomponents-client}} and use this to follow HttpComponents development or contribute pull requests. If you're interested in development, please see the Contributing section below for details on our development process.
   
   * Reporting issues:
      
      * {{{https://issues.apache.org/jira/projects/HTTPCORE}HttpComponents Core}}
      
      * {{{https://issues.apache.org/jira/projects/HTTPCLIENT}HttpComponents Client}} and {{{https://issues.apache.org/jira/projects/HTTPASYNC}HttpComponents AsyncClient}}
   
   * Slack: Some committers and users are present in the channel {{{https://the-asf.slack.com/archives/CGC9KPJKH}#httpcomponents-client}} on the Apache Slack team.
   
   * StackOverflow: While the user mailing list is the primary resource for asking questions, if you prefer StackOverflow, make sure to tag your question with {{{https://stackoverflow.com/questions/tagged/apache-httpcomponents}apache-httpcomponents}}.

Contributing

   HttpComponents is a community-led project and we are delighted to receive contributions of anything from minor fixes to new features.
   If you have an itch to scratch, then by all means do that! Fixing bugs you run into, or adding features you need, are both immensely helpful.
   There are plenty of ways to help outside writing code. Code review of pull requests (even if you are not a committer), feature suggestions, reporting bugs, documentation and usability feedback all matter immensely.

Testing

   All Pull Requests are automatically tested on {{{https://travis-ci.com/apache/httpcomponents-core}Travis CI (Core)}}, {{{https://travis-ci.com/apache/httpcomponents-client}Travis CI (Client)}} on both AMD64 and ARM64 architectures.

More information

   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.
