v0.3.19 - last save before major refactoring
This commit is contained in:
115
src/main.c
115
src/main.c
@@ -1716,7 +1716,15 @@ cJSON* generate_relay_info_json() {
|
||||
return info;
|
||||
}
|
||||
|
||||
// Handle NIP-11 HTTP request
|
||||
// NIP-11 HTTP session data structure for managing buffer lifetime
|
||||
struct nip11_session_data {
|
||||
char* json_buffer;
|
||||
size_t json_length;
|
||||
int headers_sent;
|
||||
int body_sent;
|
||||
};
|
||||
|
||||
// Handle NIP-11 HTTP request with proper asynchronous buffer management
|
||||
int handle_nip11_http_request(struct lws* wsi, const char* accept_header) {
|
||||
log_info("Handling NIP-11 relay information request");
|
||||
|
||||
@@ -1805,6 +1813,23 @@ int handle_nip11_http_request(struct lws* wsi, const char* accept_header) {
|
||||
|
||||
size_t json_len = strlen(json_string);
|
||||
|
||||
// Allocate session data to manage buffer lifetime across callbacks
|
||||
struct nip11_session_data* session_data = malloc(sizeof(struct nip11_session_data));
|
||||
if (!session_data) {
|
||||
log_error("Failed to allocate NIP-11 session data");
|
||||
free(json_string);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Store JSON buffer in session data for asynchronous handling
|
||||
session_data->json_buffer = json_string;
|
||||
session_data->json_length = json_len;
|
||||
session_data->headers_sent = 0;
|
||||
session_data->body_sent = 0;
|
||||
|
||||
// Store session data in WSI user data for callback access
|
||||
lws_set_wsi_user(wsi, session_data);
|
||||
|
||||
// Prepare HTTP response with CORS headers
|
||||
unsigned char buf[LWS_PRE + 1024];
|
||||
unsigned char *p = &buf[LWS_PRE];
|
||||
@@ -1813,70 +1838,66 @@ int handle_nip11_http_request(struct lws* wsi, const char* accept_header) {
|
||||
|
||||
// Add status
|
||||
if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Add content type
|
||||
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,
|
||||
(unsigned char*)"application/nostr+json", 22, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Add content length
|
||||
if (lws_add_http_header_content_length(wsi, json_len, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Add CORS headers as required by NIP-11
|
||||
if (lws_add_http_header_by_name(wsi, (unsigned char*)"access-control-allow-origin:",
|
||||
(unsigned char*)"*", 1, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
if (lws_add_http_header_by_name(wsi, (unsigned char*)"access-control-allow-headers:",
|
||||
(unsigned char*)"content-type, accept", 20, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
if (lws_add_http_header_by_name(wsi, (unsigned char*)"access-control-allow-methods:",
|
||||
(unsigned char*)"GET, OPTIONS", 12, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Finalize headers
|
||||
if (lws_finalize_http_header(wsi, &p, end)) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Write headers
|
||||
if (lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS) < 0) {
|
||||
free(json_string);
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Write JSON body
|
||||
unsigned char *json_buf = malloc(LWS_PRE + json_len);
|
||||
if (!json_buf) {
|
||||
free(json_string);
|
||||
return -1;
|
||||
}
|
||||
session_data->headers_sent = 1;
|
||||
|
||||
memcpy(json_buf + LWS_PRE, json_string, json_len);
|
||||
if (lws_write(wsi, json_buf + LWS_PRE, json_len, LWS_WRITE_HTTP) < 0) {
|
||||
free(json_string);
|
||||
free(json_buf);
|
||||
return -1;
|
||||
}
|
||||
// Request callback for body transmission
|
||||
lws_callback_on_writable(wsi);
|
||||
|
||||
free(json_buf);
|
||||
|
||||
free(json_string);
|
||||
log_success("NIP-11 relay information served successfully");
|
||||
log_success("NIP-11 headers sent, body transmission scheduled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3163,7 +3184,49 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso
|
||||
}
|
||||
|
||||
case LWS_CALLBACK_HTTP_WRITEABLE:
|
||||
// HTTP response continuation if needed
|
||||
// Handle NIP-11 HTTP body transmission with proper buffer management
|
||||
{
|
||||
struct nip11_session_data* session_data = (struct nip11_session_data*)lws_wsi_user(wsi);
|
||||
if (session_data && session_data->headers_sent && !session_data->body_sent) {
|
||||
// Allocate buffer for JSON body transmission
|
||||
unsigned char *json_buf = malloc(LWS_PRE + session_data->json_length);
|
||||
if (!json_buf) {
|
||||
log_error("Failed to allocate buffer for NIP-11 body transmission");
|
||||
// Clean up session data
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
lws_set_wsi_user(wsi, NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Copy JSON data to buffer
|
||||
memcpy(json_buf + LWS_PRE, session_data->json_buffer, session_data->json_length);
|
||||
|
||||
// Write JSON body
|
||||
int write_result = lws_write(wsi, json_buf + LWS_PRE, session_data->json_length, LWS_WRITE_HTTP);
|
||||
|
||||
// Free the transmission buffer immediately (it's been copied by libwebsockets)
|
||||
free(json_buf);
|
||||
|
||||
if (write_result < 0) {
|
||||
log_error("Failed to write NIP-11 JSON body");
|
||||
// Clean up session data
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
lws_set_wsi_user(wsi, NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Mark body as sent and clean up session data
|
||||
session_data->body_sent = 1;
|
||||
free(session_data->json_buffer);
|
||||
free(session_data);
|
||||
lws_set_wsi_user(wsi, NULL);
|
||||
|
||||
log_success("NIP-11 relay information served successfully");
|
||||
return 0; // Close connection after successful transmission
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case LWS_CALLBACK_ESTABLISHED:
|
||||
|
||||
Reference in New Issue
Block a user