| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/devtools_bridge/socket_tunnel_packet_handler.h" | |
| 6 | |
| 7 #include <stdlib.h> | |
| 8 | |
| 9 #include "components/devtools_bridge/socket_tunnel_connection.h" | |
| 10 #include "net/base/io_buffer.h" | |
| 11 #include "net/base/net_errors.h" | |
| 12 | |
| 13 namespace devtools_bridge { | |
| 14 | |
| 15 static const int kControlConnectionId = | |
| 16 SocketTunnelConnection::kControlConnectionId; | |
| 17 static const int kMinConnectionId = SocketTunnelConnection::kMinConnectionId; | |
| 18 static const int kMaxConnectionId = SocketTunnelConnection::kMaxConnectionId; | |
| 19 static const int kControlPacketSizeBytes = | |
| 20 SocketTunnelConnection::kControlPacketSizeBytes; | |
| 21 | |
| 22 void SocketTunnelPacketHandler::DecodePacket(const void* data, size_t length) { | |
| 23 const unsigned char* bytes = static_cast<const unsigned char*>(data); | |
| 24 if (length == 0) { | |
| 25 DLOG(ERROR) << "Empty packet"; | |
| 26 HandleProtocolError(); | |
| 27 return; | |
| 28 } | |
| 29 int connection_id = bytes[0]; | |
| 30 if (connection_id != kControlConnectionId) { | |
| 31 if (connection_id < kMinConnectionId || | |
| 32 connection_id > kMaxConnectionId) { | |
| 33 DLOG(ERROR) << "Invalid connection ID: " << connection_id; | |
| 34 HandleProtocolError(); | |
| 35 return; | |
| 36 } | |
| 37 | |
| 38 int connection_index = connection_id - kMinConnectionId; | |
| 39 scoped_refptr<net::IOBufferWithSize> packet( | |
| 40 new net::IOBufferWithSize(length - 1)); | |
| 41 memcpy(packet->data(), bytes + 1, length - 1); | |
| 42 HandleDataPacket(connection_index, packet); | |
| 43 } else if (length >= kControlPacketSizeBytes) { | |
| 44 static_assert(kControlPacketSizeBytes == 3, | |
| 45 "kControlPacketSizeBytes should equal 3"); | |
| 46 | |
| 47 int op_code = bytes[1]; | |
| 48 connection_id = bytes[2]; | |
| 49 if (connection_id < kMinConnectionId || | |
| 50 connection_id > kMaxConnectionId) { | |
| 51 DLOG(ERROR) << "Invalid connection ID: " << connection_id; | |
| 52 HandleProtocolError(); | |
| 53 return; | |
| 54 } | |
| 55 int connection_index = connection_id - kMinConnectionId; | |
| 56 HandleControlPacket(connection_index, op_code); | |
| 57 } else { | |
| 58 DLOG(ERROR) << "Invalid packet"; | |
| 59 HandleProtocolError(); | |
| 60 return; | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 } // namespace devtools_bridge | |
| OLD | NEW |