79 lines
2.5 KiB
C
79 lines
2.5 KiB
C
#include <windows.h>
|
|||
|
|
#include <stdio.h>
|
||
|
|
#include "badger_exports.h"
|
||
|
|
|
||
|
|
// compile with:
|
||
|
|
// x86_64-w64-mingw32-gcc modify_http.c -c -o modify_http.o
|
||
|
|
|
||
|
|
char* RemoveDelimiter(char* src_buffer) {
|
||
|
|
int i, j = 0;
|
||
|
|
size_t len = BadgerStrlen(src_buffer);
|
||
|
|
char* dst_buffer = (char*)BadgerAlloc(len + 1); // +1 for the null terminator
|
||
|
|
if (! dst_buffer) {
|
||
|
|
return NULL; // Allocation failed
|
||
|
|
}
|
||
|
|
BadgerMemcpy(dst_buffer, src_buffer, len);
|
||
|
|
for (i = 0; i < len; i++) {
|
||
|
|
// If the current character is not '$', copy it to the new position
|
||
|
|
if (dst_buffer[i] != '$') {
|
||
|
|
dst_buffer[j++] = dst_buffer[i];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// Null-terminate the modified string
|
||
|
|
dst_buffer[j] = '\0';
|
||
|
|
return dst_buffer;
|
||
|
|
}
|
||
|
|
|
||
|
|
char* DelimitBuffer(char* src_buffer, size_t part_size) {
|
||
|
|
size_t size = BadgerStrlen(src_buffer);
|
||
|
|
if (size == 0 || part_size == 0 || part_size > size) {
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
// Calculate the number of parts
|
||
|
|
size_t num_parts = (size + part_size - 1) / part_size; // ceil(size / part_size)
|
||
|
|
size_t new_size = size + (num_parts - 1); // Additional space for delimiters
|
||
|
|
|
||
|
|
// Allocate memory for the new string
|
||
|
|
char* dst_buffer = (char*)BadgerAlloc(new_size + 1); // +1 for the null terminator
|
||
|
|
if (! dst_buffer) {
|
||
|
|
return NULL; // Allocation failed
|
||
|
|
}
|
||
|
|
size_t new_index = 0;
|
||
|
|
// Split the src_buffer and add delimiters
|
||
|
|
for (size_t i = 0; i < size; i += part_size) {
|
||
|
|
// Copy the part
|
||
|
|
size_t current_part_size = (i + part_size <= size) ? part_size : (size - i);
|
||
|
|
BadgerMemcpy(&dst_buffer[new_index], &src_buffer[i], current_part_size);
|
||
|
|
new_index += current_part_size;
|
||
|
|
// Add delimiter if not the last part
|
||
|
|
if (i + part_size < size) {
|
||
|
|
dst_buffer[new_index++] = '$';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Null terminate the new string
|
||
|
|
dst_buffer[new_index] = '\0';
|
||
|
|
return dst_buffer;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void coffee(char** argv, int argc, WCHAR** dispatch) {
|
||
|
|
// argc will be 2
|
||
|
|
// argv[0] : if string "0", its request; if string "1", its response
|
||
|
|
// argv[1] : contains request or response buffer depending on argv[0]
|
||
|
|
|
||
|
|
CHAR *src_buffer = argv[1];
|
||
|
|
CHAR *dst_buffer = NULL;
|
||
|
|
|
||
|
|
if (BadgerStrcmp(argv[0], "0") == 0) {
|
||
|
|
size_t part_size = 5;
|
||
|
|
dst_buffer = DelimitBuffer(src_buffer, part_size);
|
||
|
|
} else if (BadgerStrcmp(argv[0], "1") == 0) {
|
||
|
|
dst_buffer = RemoveDelimiter(src_buffer);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (dst_buffer) {
|
||
|
|
BadgerSetHTTPBuffer((PVOID)dst_buffer);
|
||
|
|
BadgerFree((PVOID*)&dst_buffer);
|
||
|
|
}
|
||
|
|
}
|