Return if we handle any error messages to avoid unnecessarily calling recv/send
[folly.git] / folly / io / async / AsyncSocketException.h
index 7b334da4957b375011ca850554f511f3fece4b36..1e9a114ad8584b4e5eb12d063d8209050a7be635 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017-present Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #pragma once
 
-#include <folly/Format.h>
-#include <folly/io/async/DelayedDestruction.h>
+#include <stdexcept>
+#include <string>
+
+#include <folly/CPortability.h>
+#include <folly/Range.h>
 
 namespace folly {
 
-class AsyncSocketException : public std::runtime_error {
+class FOLLY_EXPORT AsyncSocketException : public std::runtime_error {
  public:
-  enum AsyncSocketExceptionType
-  { UNKNOWN = 0
-  , NOT_OPEN = 1
-  , ALREADY_OPEN = 2
-  , TIMED_OUT = 3
-  , END_OF_FILE = 4
-  , INTERRUPTED = 5
-  , BAD_ARGS = 6
-  , CORRUPTED_DATA = 7
-  , INTERNAL_ERROR = 8
-  , NOT_SUPPORTED = 9
-  , INVALID_STATE = 10
-  , SSL_ERROR = 12
-  , COULD_NOT_BIND = 13
-  , SASL_HANDSHAKE_TIMEOUT = 14
+  enum AsyncSocketExceptionType {
+    UNKNOWN = 0,
+    NOT_OPEN = 1,
+    ALREADY_OPEN = 2,
+    TIMED_OUT = 3,
+    END_OF_FILE = 4,
+    INTERRUPTED = 5,
+    BAD_ARGS = 6,
+    CORRUPTED_DATA = 7,
+    INTERNAL_ERROR = 8,
+    NOT_SUPPORTED = 9,
+    INVALID_STATE = 10,
+    SSL_ERROR = 12,
+    COULD_NOT_BIND = 13,
+    SASL_HANDSHAKE_TIMEOUT = 14,
+    NETWORK_ERROR = 15,
+    EARLY_DATA_REJECTED = 16,
   };
 
   AsyncSocketException(
-    AsyncSocketExceptionType type, const std::string& message) :
-      std::runtime_error(message),
-      type_(type), errno_(0) {}
+      AsyncSocketExceptionType type,
+      const std::string& message,
+      int errnoCopy = 0)
+      : std::runtime_error(getMessage(type, message, errnoCopy)),
+        type_(type),
+        errno_(errnoCopy) {}
 
   /** Error code */
   AsyncSocketExceptionType type_;
@@ -51,30 +58,24 @@ class AsyncSocketException : public std::runtime_error {
   /** A copy of the errno. */
   int errno_;
 
-  AsyncSocketException(AsyncSocketExceptionType type,
-                      const std::string& message,
-                      int errno_copy) :
-      std::runtime_error(getMessage(message, errno_copy)),
-      type_(type), errno_(errno_copy) {}
+  AsyncSocketExceptionType getType() const noexcept {
+    return type_;
+  }
 
-  AsyncSocketExceptionType getType() const noexcept { return type_; }
-  int getErrno() const noexcept { return errno_; }
+  int getErrno() const noexcept {
+    return errno_;
+  }
 
  protected:
-  /** Just like strerror_r but returns a C++ string object. */
-  std::string strerror_s(int errno_copy) {
-    return "errno = " + folly::to<std::string>(errno_copy);
-  }
+  /** get the string of exception type */
+  static folly::StringPiece getExceptionTypeString(
+      AsyncSocketExceptionType type);
 
   /** Return a message based on the input. */
-  std::string getMessage(const std::string &message,
-                                int errno_copy) {
-    if (errno_copy != 0) {
-      return message + ": " + strerror_s(errno_copy);
-    } else {
-      return message;
-    }
-  }
+  static std::string getMessage(
+      AsyncSocketExceptionType type,
+      const std::string& message,
+      int errnoCopy);
 };
 
-} // folly
+} // namespace folly