Update.
This commit is contained in:
parent
e02315a0f6
commit
91598ce1ef
4
Makefile
4
Makefile
@ -1,11 +1,11 @@
|
|||||||
all: build run
|
all: build run
|
||||||
|
|
||||||
build:
|
build:
|
||||||
gcc main.c -lssl -lcrypto -ljson-c -Ofast -o r -Werror -Wall -lpython3.14 -I/usr/include/python3.14 -lreadline -lncurses
|
gcc main.c -lcurl -lssl -lcrypto -ljson-c -Ofast -o r -Werror -Wall -lpython3.14 -I/usr/include/python3.14 -lreadline -lncurses
|
||||||
publish r
|
publish r
|
||||||
|
|
||||||
build_free:
|
build_free:
|
||||||
gcc main.c -DFREE_VERSION -lssl -lcrypto -ljson-c -Ofast -o rf -Werror -Wall -lpython3.14 -I/usr/include/python3.14 -lreadline -lncurses
|
gcc main.c -lcurl -DFREE_VERSION -lssl -lcrypto -ljson-c -Ofast -o rf -Werror -Wall -lpython3.14 -I/usr/include/python3.14 -lreadline -lncurses
|
||||||
publish rf
|
publish rf
|
||||||
|
|
||||||
run:
|
run:
|
||||||
|
4
auth.h
4
auth.h
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
|
#ifndef R_AUTH_H
|
||||||
|
#define R_AUTH_H
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@ -28,3 +30,5 @@ const char * resolve_api_key(){
|
|||||||
api_key = "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";
|
api_key = "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";
|
||||||
return api_key;
|
return api_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
31
http.h
31
http.h
@ -166,8 +166,8 @@ char *https_post(char *url, char *data)
|
|||||||
SSL_set_tlsext_host_name(ssl, hostname);
|
SSL_set_tlsext_host_name(ssl, hostname);
|
||||||
SSL_set_fd(ssl, sock);
|
SSL_set_fd(ssl, sock);
|
||||||
|
|
||||||
int buffer_size = 4096;
|
int buffer_size = 1024*1024;
|
||||||
char *buffer = malloc(buffer_size);
|
char *buffer = (char *)malloc(buffer_size);
|
||||||
size_t chunk_size_total = 0;
|
size_t chunk_size_total = 0;
|
||||||
if (SSL_connect(ssl) <= 0)
|
if (SSL_connect(ssl) <= 0)
|
||||||
{
|
{
|
||||||
@ -176,7 +176,7 @@ char *https_post(char *url, char *data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t len = strlen(data);
|
size_t len = strlen(data);
|
||||||
char *request = malloc(len + 4096);
|
char *request = (char *)malloc(len + 1024*1024);
|
||||||
sprintf(request,
|
sprintf(request,
|
||||||
"POST %s HTTP/1.1\r\n"
|
"POST %s HTTP/1.1\r\n"
|
||||||
"Content-Length: %ld\r\n"
|
"Content-Length: %ld\r\n"
|
||||||
@ -203,7 +203,7 @@ char *https_post(char *url, char *data)
|
|||||||
while (remaining > 0)
|
while (remaining > 0)
|
||||||
{
|
{
|
||||||
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
||||||
buffer = realloc(buffer, actual_buffer_size + to_read + 1);
|
buffer = (char *)realloc(buffer, actual_buffer_size + to_read + 1);
|
||||||
actual_buffer_size += to_read;
|
actual_buffer_size += to_read;
|
||||||
size_t bytes_read = SSL_read(ssl, buffer + chunk_size_total, to_read);
|
size_t bytes_read = SSL_read(ssl, buffer + chunk_size_total, to_read);
|
||||||
chunk_size_total += bytes_read;
|
chunk_size_total += bytes_read;
|
||||||
@ -275,7 +275,7 @@ char *https_get(char *url)
|
|||||||
while (remaining > 0)
|
while (remaining > 0)
|
||||||
{
|
{
|
||||||
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
||||||
buffer = realloc(buffer, actual_buffer_size + to_read + 1);
|
buffer = (char *)realloc(buffer, actual_buffer_size + to_read + 1);
|
||||||
actual_buffer_size += to_read;
|
actual_buffer_size += to_read;
|
||||||
size_t bytes_read = SSL_read(ssl, buffer + chunk_size_total, to_read);
|
size_t bytes_read = SSL_read(ssl, buffer + chunk_size_total, to_read);
|
||||||
chunk_size_total += bytes_read;
|
chunk_size_total += bytes_read;
|
||||||
@ -308,11 +308,11 @@ char *http_post(char *url, char *data)
|
|||||||
int sock = create_socket(hostname, port);
|
int sock = create_socket(hostname, port);
|
||||||
|
|
||||||
int buffer_size = 1024 * 1024;
|
int buffer_size = 1024 * 1024;
|
||||||
char *buffer = malloc(buffer_size);
|
char *buffer = (char *)malloc(buffer_size);
|
||||||
size_t chunk_size_total = 0;
|
size_t chunk_size_total = 0;
|
||||||
|
|
||||||
size_t len = strlen(data);
|
size_t len = strlen(data) + strlen(path) + strlen(resolve_api_key()) + 10;
|
||||||
char *request = malloc(len + buffer_size);
|
char *request = (char *)malloc(len + buffer_size);
|
||||||
sprintf(request,
|
sprintf(request,
|
||||||
"POST %s HTTP/1.1\r\n"
|
"POST %s HTTP/1.1\r\n"
|
||||||
"Content-Length: %ld\r\n"
|
"Content-Length: %ld\r\n"
|
||||||
@ -327,7 +327,6 @@ char *http_post(char *url, char *data)
|
|||||||
free(request);
|
free(request);
|
||||||
|
|
||||||
char *headers = read_until(sock, "\r\n\r\n");
|
char *headers = read_until(sock, "\r\n\r\n");
|
||||||
printf("%s\n",headers);
|
|
||||||
(void)headers;
|
(void)headers;
|
||||||
|
|
||||||
size_t actual_buffer_size = buffer_size;
|
size_t actual_buffer_size = buffer_size;
|
||||||
@ -336,24 +335,30 @@ char *http_post(char *url, char *data)
|
|||||||
char *header = read_until(sock, "\r\n");
|
char *header = read_until(sock, "\r\n");
|
||||||
size_t chunk_size = hex_to_int(header);
|
size_t chunk_size = hex_to_int(header);
|
||||||
if (chunk_size == 0)
|
if (chunk_size == 0)
|
||||||
|
{ printf("END\n");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
size_t remaining = chunk_size;
|
size_t remaining = chunk_size;
|
||||||
while (remaining > 0)
|
while (remaining > 0)
|
||||||
{
|
{
|
||||||
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
||||||
buffer = realloc(buffer, actual_buffer_size + to_read + 1);
|
buffer = (char *)realloc(buffer, actual_buffer_size + to_read + 10);
|
||||||
actual_buffer_size += to_read;
|
actual_buffer_size += to_read;
|
||||||
size_t bytes_read = recv(sock, buffer + chunk_size_total, to_read,0);
|
size_t bytes_read = recv(sock, buffer + chunk_size_total, to_read,0);
|
||||||
chunk_size_total += bytes_read;
|
|
||||||
if (bytes_read <= 0)
|
if (bytes_read <= 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error reading chunk data\n");
|
fprintf(stderr, "Error reading chunk data\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chunk_size_total += bytes_read;
|
||||||
|
|
||||||
// fwrite(buffer, 1, bytes_read, stdout); // Output chunk data
|
// fwrite(buffer, 1, bytes_read, stdout); // Output chunk data
|
||||||
remaining -= bytes_read;
|
remaining -= bytes_read;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
printf("HIERRR!\n");
|
||||||
buffer[chunk_size_total] = 0;
|
buffer[chunk_size_total] = 0;
|
||||||
|
|
||||||
|
|
||||||
@ -373,7 +378,7 @@ char *http_get(char *url)
|
|||||||
int sock = create_socket(hostname, port);
|
int sock = create_socket(hostname, port);
|
||||||
|
|
||||||
|
|
||||||
int buffer_size = 4096;
|
int buffer_size = 1024*1024;
|
||||||
char *buffer = (char *)malloc(buffer_size);
|
char *buffer = (char *)malloc(buffer_size);
|
||||||
|
|
||||||
|
|
||||||
@ -401,7 +406,7 @@ char *http_get(char *url)
|
|||||||
while (remaining > 0)
|
while (remaining > 0)
|
||||||
{
|
{
|
||||||
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
size_t to_read = (remaining < buffer_size) ? remaining : buffer_size;
|
||||||
buffer = realloc(buffer, actual_buffer_size + to_read + 1);
|
buffer = (char *)realloc(buffer, actual_buffer_size + to_read + 1);
|
||||||
actual_buffer_size += to_read;
|
actual_buffer_size += to_read;
|
||||||
size_t bytes_read = recv(sock, buffer + chunk_size_total, to_read,0);
|
size_t bytes_read = recv(sock, buffer + chunk_size_total, to_read,0);
|
||||||
chunk_size_total += bytes_read;
|
chunk_size_total += bytes_read;
|
||||||
|
82
http_curl.h
Normal file
82
http_curl.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#ifndef HTTP_CURL
|
||||||
|
#define HTTP_CURL
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include "auth.h"
|
||||||
|
|
||||||
|
// Buffer to store the response
|
||||||
|
struct ResponseBuffer {
|
||||||
|
char *data; // Pointer to the response data
|
||||||
|
size_t size; // Size of the data
|
||||||
|
};
|
||||||
|
|
||||||
|
// Callback function to handle the response
|
||||||
|
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
|
||||||
|
size_t total_size = size * nmemb;
|
||||||
|
struct ResponseBuffer *response = (struct ResponseBuffer *)userp;
|
||||||
|
|
||||||
|
// Reallocate memory to fit new data
|
||||||
|
char *ptr = realloc(response->data, response->size + total_size + 1);
|
||||||
|
if (ptr == NULL) {
|
||||||
|
fprintf(stderr, "Failed to allocate memory for response\n");
|
||||||
|
return 0; // Returning 0 will signal libcurl to abort the request
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign the newly allocated memory to response->data
|
||||||
|
response->data = ptr;
|
||||||
|
|
||||||
|
// Copy the new data into the buffer
|
||||||
|
memcpy(&(response->data[response->size]), contents, total_size);
|
||||||
|
|
||||||
|
// Update the size of the buffer
|
||||||
|
response->size += total_size;
|
||||||
|
|
||||||
|
// Null-terminate the string
|
||||||
|
response->data[response->size] = '\0';
|
||||||
|
|
||||||
|
return total_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * curl_post(const char * url, const char * data) {
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
struct ResponseBuffer response;
|
||||||
|
response.data = (char *)malloc(1);
|
||||||
|
response.size = 0;
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if (curl) {
|
||||||
|
struct curl_slist *headers = NULL;
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
|
|
||||||
|
headers = curl_slist_append(headers, "Content-Type: application/json");
|
||||||
|
|
||||||
|
char * bearer_header = (char *)malloc(1337);
|
||||||
|
sprintf(bearer_header, "Authorization: Bearer %s", resolve_api_key());
|
||||||
|
headers = curl_slist_append(headers, bearer_header);
|
||||||
|
|
||||||
|
free(bearer_header);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Error occured: %s\n", curl_easy_strerror(res));
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_slist_free_all(headers);
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
6
openai.h
6
openai.h
@ -13,6 +13,7 @@
|
|||||||
#define R_OPENAI_H
|
#define R_OPENAI_H
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "chat.h"
|
#include "chat.h"
|
||||||
|
#include "http_curl.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
@ -24,7 +25,7 @@ char *openai_get_models() {
|
|||||||
bool openai_system(char *content) {
|
bool openai_system(char *content) {
|
||||||
char *url = "https://api.openai.com/v1/chat/completions";
|
char *url = "https://api.openai.com/v1/chat/completions";
|
||||||
char *data = chat_json("system", content);
|
char *data = chat_json("system", content);
|
||||||
char *result = https_post(url, data);
|
char *result = curl_post(url, data);
|
||||||
bool is_done = result != NULL;
|
bool is_done = result != NULL;
|
||||||
|
|
||||||
free(result);
|
free(result);
|
||||||
@ -34,8 +35,7 @@ bool openai_system(char *content) {
|
|||||||
char *openai_chat(char *role, char *content) {
|
char *openai_chat(char *role, char *content) {
|
||||||
char *url = "https://api.openai.com/v1/chat/completions";
|
char *url = "https://api.openai.com/v1/chat/completions";
|
||||||
char *data = chat_json(role, content);
|
char *data = chat_json(role, content);
|
||||||
char *result = https_post(url, data);
|
char *result = curl_post(url, data);
|
||||||
|
|
||||||
struct json_object *parsed_json = json_tokener_parse(result);
|
struct json_object *parsed_json = json_tokener_parse(result);
|
||||||
if (!parsed_json) {
|
if (!parsed_json) {
|
||||||
fprintf(stderr, "Failed to parse JSON.\n");
|
fprintf(stderr, "Failed to parse JSON.\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user