-
Notifications
You must be signed in to change notification settings - Fork 0
/
ts_mruby_connection.cpp
84 lines (66 loc) · 2.92 KB
/
ts_mruby_connection.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
// ts_mruby_connection.c - ts_mruby mruby module
//
*/
#include "ts_mruby_connection.hpp"
#include "ts_mruby_internal.hpp"
#include <atscppapi/Transaction.h>
#include <atscppapi/utils.h>
#include <mruby.h>
#include <mruby/class.h>
#include <mruby/compile.h>
#include <mruby/data.h>
#include <mruby/hash.h>
#include <mruby/proc.h>
#include <mruby/string.h>
#include <mruby/variable.h>
using namespace atscppapi;
using std::string;
static mrb_value ts_mrb_get_conn_var_remote_addr(mrb_state *mrb,
mrb_value self) {
auto *context = reinterpret_cast<TSMrubyContext *>(mrb->ud);
Transaction *transaction = context->getTransaction();
const sockaddr *addr = transaction->getClientAddress();
const string &remote_addr = utils::getIpString(addr);
return mrb_str_new(mrb, remote_addr.c_str(), remote_addr.length());
}
static mrb_value ts_mrb_get_conn_var_remote_port(mrb_state *mrb,
mrb_value self) {
auto *context = reinterpret_cast<TSMrubyContext *>(mrb->ud);
Transaction *transaction = context->getTransaction();
const sockaddr *addr = transaction->getClientAddress();
uint16_t remote_port = utils::getPort(addr);
const string &port_str = std::to_string(remote_port);
return mrb_str_new(mrb, port_str.c_str(), port_str.length());
}
static mrb_value ts_mrb_get_conn_var_server_addr(mrb_state *mrb,
mrb_value self) {
auto *context = reinterpret_cast<TSMrubyContext *>(mrb->ud);
Transaction *transaction = context->getTransaction();
const sockaddr *addr = transaction->getIncomingAddress();
const string &server_addr = utils::getIpString(addr);
return mrb_str_new(mrb, server_addr.c_str(), server_addr.length());
}
static mrb_value ts_mrb_get_conn_var_server_port(mrb_state *mrb,
mrb_value self) {
auto *context = reinterpret_cast<TSMrubyContext *>(mrb->ud);
Transaction *transaction = context->getTransaction();
const sockaddr *addr = transaction->getIncomingAddress();
uint16_t server_port = utils::getPort(addr);
const string &port_str = std::to_string(server_port);
return mrb_str_new(mrb, port_str.c_str(), port_str.length());
}
void ts_mrb_connection_class_init(mrb_state *mrb, struct RClass *rclass) {
struct RClass *class_conn;
// Connection::
class_conn =
mrb_define_class_under(mrb, rclass, "Connection", mrb->object_class);
mrb_define_method(mrb, class_conn, "remote_ip",
ts_mrb_get_conn_var_remote_addr, MRB_ARGS_NONE());
mrb_define_method(mrb, class_conn, "remote_port",
ts_mrb_get_conn_var_remote_port, MRB_ARGS_NONE());
mrb_define_method(mrb, class_conn, "local_ip",
ts_mrb_get_conn_var_server_addr, MRB_ARGS_NONE());
mrb_define_method(mrb, class_conn, "local_port",
ts_mrb_get_conn_var_server_port, MRB_ARGS_NONE());
}