#include <libusockets.h>
const int SSL = 1;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct echo_socket {
char *backpressure;
int length;
};
struct echo_context {
};
void on_wakeup(struct us_loop_t *loop) {
}
void on_pre(struct us_loop_t *loop) {
}
void on_post(struct us_loop_t *loop) {
}
struct us_socket_t *on_echo_socket_writable(struct us_socket_t *s) {
struct echo_socket *es = (struct echo_socket *) us_socket_ext(SSL, s);
int written = us_socket_write(SSL, s, es->backpressure, es->length, 0);
if (written != es->length) {
char *new_buffer = (char *) malloc(es->length - written);
memcpy(new_buffer, es->backpressure, es->length - written);
free(es->backpressure);
es->backpressure = new_buffer;
es->length -= written;
} else {
free(es->backpressure);
es->length = 0;
}
us_socket_timeout(SSL, s, 30);
return s;
}
struct us_socket_t *on_echo_socket_close(struct us_socket_t *s, int code, void *reason) {
struct echo_socket *es = (struct echo_socket *) us_socket_ext(SSL, s);
printf("Client disconnected\n");
free(es->backpressure);
return s;
}
struct us_socket_t *on_echo_socket_end(struct us_socket_t *s) {
us_socket_shutdown(SSL, s);
return us_socket_close(SSL, s, 0, NULL);
}
struct us_socket_t *on_echo_socket_data(struct us_socket_t *s, char *data, int length) {
struct echo_socket *es = (struct echo_socket *) us_socket_ext(SSL, s);
printf("Client sent <%.*s>\n", length, data);
int written = us_socket_write(SSL, s, data, length, 0);
if (written != length) {
char *new_buffer = (char *) malloc(es->length + length - written);
memcpy(new_buffer, es->backpressure, es->length);
memcpy(new_buffer + es->length, data + written, length - written);
free(es->backpressure);
es->backpressure = new_buffer;
es->length += length - written;
}
us_socket_timeout(SSL, s, 30);
return s;
}
struct us_socket_t *on_echo_socket_open(struct us_socket_t *s, int is_client, char *ip, int ip_length) {
struct echo_socket *es = (struct echo_socket *) us_socket_ext(SSL, s);
es->backpressure = 0;
es->length = 0;
us_socket_timeout(SSL, s, 30);
printf("Client connected\n");
return s;
}
struct us_socket_t *on_echo_socket_timeout(struct us_socket_t *s) {
printf("Client was idle for too long\n");
return us_socket_close(SSL, s, 0, NULL);
}
int main() {
struct us_loop_t *loop = us_create_loop(0, on_wakeup, on_pre, on_post, 0);
struct us_socket_context_options_t options = {};
options.key_file_name = "/home/alexhultman/uWebSockets.js/misc/key.pem";
options.cert_file_name = "/home/alexhultman/uWebSockets.js/misc/cert.pem";
options.passphrase = "1234";
struct us_socket_context_t *echo_context = us_create_socket_context(SSL, loop, sizeof(struct echo_context), options);
us_socket_context_on_open(SSL, echo_context, on_echo_socket_open);
us_socket_context_on_data(SSL, echo_context, on_echo_socket_data);
us_socket_context_on_writable(SSL, echo_context, on_echo_socket_writable);
us_socket_context_on_close(SSL, echo_context, on_echo_socket_close);
us_socket_context_on_timeout(SSL, echo_context, on_echo_socket_timeout);
us_socket_context_on_end(SSL, echo_context, on_echo_socket_end);
struct us_listen_socket_t *listen_socket = us_socket_context_listen(SSL, echo_context, 0, 3000, 0, sizeof(struct echo_socket));
if (listen_socket) {
printf("Listening on port 3000...\n");
us_loop_run(loop);
} else {
printf("Failed to listen!\n");
}
}