// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/websockets/websocket_errors.h"

#include "base/logging.h"

namespace net {

Error WebSocketErrorToNetError(WebSocketError error) {
  switch (error) {
    case kWebSocketNormalClosure:
      return OK;

    case kWebSocketErrorGoingAway:  // TODO(ricea): More specific code?
    case kWebSocketErrorProtocolError:
    case kWebSocketErrorUnsupportedData:
    case kWebSocketErrorInvalidFramePayloadData:
    case kWebSocketErrorPolicyViolation:
    case kWebSocketErrorMandatoryExtension:
    case kWebSocketErrorInternalServerError:
      return ERR_WS_PROTOCOL_ERROR;

    case kWebSocketErrorNoStatusReceived:
    case kWebSocketErrorAbnormalClosure:
      return ERR_CONNECTION_CLOSED;

    case kWebSocketErrorTlsHandshake:
      // This error will probably be reported with more detail at a lower layer;
      // this is the best we can do at this layer.
      return ERR_SSL_PROTOCOL_ERROR;

    case kWebSocketErrorMessageTooBig:
      return ERR_MSG_TOO_BIG;

    default:
      return ERR_UNEXPECTED;
  }
}

}  // namespace net
