You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

109 lines
3.2 KiB

#ifndef SRC_INSPECTOR_SOCKET_H_
#define SRC_INSPECTOR_SOCKET_H_
#include "../../config.h"
#if (SCRIPT_ENGINE_TYPE == SCRIPT_ENGINE_V8) && SE_ENABLE_INSPECTOR
#include "http_parser.h"
#include "util.h"
#include "uv.h"
#include <string>
#include <vector>
namespace node {
namespace inspector {
enum inspector_handshake_event {
kInspectorHandshakeUpgrading,
kInspectorHandshakeUpgraded,
kInspectorHandshakeHttpGet,
kInspectorHandshakeFailed
};
class InspectorSocket;
typedef void (*inspector_cb)(InspectorSocket *, int);
// Notifies as handshake is progressing. Returning false as a response to
// kInspectorHandshakeUpgrading or kInspectorHandshakeHttpGet event will abort
// the connection. inspector_write can be used from the callback.
typedef bool (*handshake_cb)(InspectorSocket *,
enum inspector_handshake_event state,
const std::string &path);
struct http_parsing_state_s {
http_parser parser;
http_parser_settings parser_settings;
handshake_cb callback;
bool done;
bool parsing_value;
std::string ws_key;
std::string path;
std::string current_header;
};
struct ws_state_s {
uv_alloc_cb alloc_cb;
uv_read_cb read_cb;
inspector_cb close_cb;
bool close_sent;
bool received_close;
};
// HTTP Wrapper around a uv_tcp_t
class InspectorSocket {
public:
InspectorSocket() : data(nullptr),
http_parsing_state(nullptr),
ws_state(nullptr),
buffer(0),
ws_mode(false),
shutting_down(false),
connection_eof(false) {}
void reinit();
void *data;
struct http_parsing_state_s *http_parsing_state;
struct ws_state_s *ws_state;
std::vector<char> buffer;
uv_tcp_t tcp;
bool ws_mode;
bool shutting_down;
bool connection_eof;
private:
NODE_DISALLOW_COPY_AND_ASSIGN(InspectorSocket);
};
int inspector_accept(uv_stream_t *server, InspectorSocket *inspector,
handshake_cb callback);
void inspector_close(InspectorSocket *inspector,
inspector_cb callback);
// Callbacks will receive stream handles. Use inspector_from_stream to get
// InspectorSocket* from the stream handle.
int inspector_read_start(InspectorSocket *inspector, uv_alloc_cb,
uv_read_cb);
void inspector_read_stop(InspectorSocket *inspector);
void inspector_write(InspectorSocket *inspector,
const char *data, size_t len);
bool inspector_is_active(const InspectorSocket *inspector);
inline InspectorSocket *inspector_from_stream(uv_tcp_t *stream) {
return node::ContainerOf(&InspectorSocket::tcp, stream);
}
inline InspectorSocket *inspector_from_stream(uv_stream_t *stream) {
return inspector_from_stream(reinterpret_cast<uv_tcp_t *>(stream));
}
inline InspectorSocket *inspector_from_stream(uv_handle_t *stream) {
return inspector_from_stream(reinterpret_cast<uv_tcp_t *>(stream));
}
} // namespace inspector
} // namespace node
#endif // #if (SCRIPT_ENGINE_TYPE == SCRIPT_ENGINE_V8) && SE_ENABLE_INSPECTOR
#endif // SRC_INSPECTOR_SOCKET_H_