Stop abusing errno
[folly.git] / folly / io / async / ssl / SSLErrors.h
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17
18 #include <folly/Optional.h>
19 #include <folly/io/async/AsyncSocketException.h>
20
21 namespace folly {
22
23 enum class SSLError {
24   CLIENT_RENEGOTIATION, // A client tried to renegotiate with this server
25   INVALID_RENEGOTIATION, // We attempted to start a renegotiation.
26   EARLY_WRITE, // Wrote before SSL connection established.
27   // An openssl error type. The openssl specific methods should be used
28   // to find the real error type.
29   // This exists for compatibility until all error types can be move to proper
30   // errors.
31   OPENSSL_ERR,
32 };
33
34 class SSLException : public folly::AsyncSocketException {
35  public:
36   SSLException(
37       int sslError,
38       unsigned long errError,
39       int sslOperationReturnValue,
40       int errno_copy);
41
42   explicit SSLException(SSLError error);
43
44   SSLError getType() const {
45     return sslError;
46   }
47
48   // These methods exist for compatibility until there are proper exceptions
49   // for all ssl error types.
50   int getOpensslSSLError() const {
51     return opensslSSLError;
52   }
53
54   unsigned long getOpensslErr() const {
55     return opensslErr;
56   }
57
58  private:
59   SSLError sslError;
60   int opensslSSLError;
61   unsigned long opensslErr;
62 };
63 }