view seobeo/seobeo_http_client_test.c @ 71:75de5903355c

Giagantic changes that update Dowa library to be more align with stb style array and hashmap. Updated Seobeo to be caching on server side instead of file level caching. Deleted bunch of things I don't really use.
author June Park <parkjune1995@gmail.com>
date Sun, 28 Dec 2025 20:34:22 -0800
parents 6626ec933933
children
line wrap: on
line source

#include "seobeo/seobeo.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// Test basic HTTP client functionality
void test_http_client_without_ssl() {
  printf("Testing HTTP client (non-SSL)...\n");

  // Create a client handle without TLS
  Seobeo_Handle *h = Seobeo_Stream_Handle_Client_Create("example.com", "80", FALSE);

  if (!h || h->socket < 0) {
    printf("  ✗ Failed to create client handle\n");
    if (h) Seobeo_Handle_Destroy(h);
    return;
  }

  printf("  ✓ Client handle created successfully\n");

  // Generate and send HTTP request
  char request[4096];
  int request_len = sprintf(
    request,
    "GET / HTTP/1.1\r\n"
    "Host: example.com\r\n"
    "Connection: close\r\n"
    "\r\n"
  );

  Seobeo_Handle_Queue(h, (uint8*)request, (uint32)request_len);
  int flush_result = Seobeo_Handle_Flush(h);

  if (flush_result < 0) {
    printf("  ✗ Failed to send request\n");
    Seobeo_Handle_Destroy(h);
    return;
  }

  printf("  ✓ Request sent successfully\n");

  // Read response
  int bytes_read = 0;
  int total_bytes = 0;
  int attempts = 0;
  const int max_attempts = 100;

  while (attempts++ < max_attempts) {
    bytes_read = Seobeo_Handle_Read(h);
    if (bytes_read > 0) {
      total_bytes += bytes_read;
    } else if (bytes_read == -2) {
      // Connection closed
      break;
    } else if (bytes_read == 0) {
      // Would block, wait a bit
      usleep(10000); // 10ms
      continue;
    } else {
      printf("  ✗ Error reading response\n");
      Seobeo_Handle_Destroy(h);
      return;
    }
  }

  if (total_bytes > 0) {
    printf("  ✓ Received response (%d bytes)\n", total_bytes);

    // Check if we got HTTP response
    if (h->read_buffer_len > 0 && strstr((char*)h->read_buffer, "HTTP/1.1") != NULL) {
      printf("  ✓ Valid HTTP response received\n");
    } else {
      printf("  ✗ Invalid HTTP response\n");
    }
  } else {
    printf("  ⚠ No response received (this may be a network issue)\n");
  }

  Seobeo_Handle_Destroy(h);
  printf("  ✓ Client handle destroyed\n");
}

void test_http_client_with_ssl() {
  printf("\nTesting HTTP client (with SSL)...\n");

#ifdef SEOBEO_NO_SSL
  printf("  ⚠ SSL not compiled in, skipping SSL test\n");
  return;
#else
  // Create a client handle with TLS
  Seobeo_Handle *h = Seobeo_Stream_Handle_Client_Create("example.com", "443", TRUE);

  if (!h || h->socket < 0) {
    printf("  ✗ Failed to create SSL client handle\n");
    if (h) Seobeo_Handle_Destroy(h);
    return;
  }

  printf("  ✓ SSL client handle created successfully\n");
  printf("  ✓ SSL handshake completed\n");

  // Generate and send HTTPS request
  char request[4096];
  int request_len = sprintf(
    request,
    "GET / HTTP/1.1\r\n"
    "Host: example.com\r\n"
    "Connection: close\r\n"
    "\r\n"
  );

  Seobeo_Handle_Queue(h, (uint8*)request, (uint32)request_len);
  int flush_result = Seobeo_Handle_Flush(h);

  if (flush_result < 0) {
    printf("  ✗ Failed to send SSL request\n");
    Seobeo_Handle_Destroy(h);
    return;
  }

  printf("  ✓ SSL request sent successfully\n");

  // Read response
  int bytes_read = 0;
  int total_bytes = 0;
  int attempts = 0;
  const int max_attempts = 100;

  while (attempts++ < max_attempts) {
    bytes_read = Seobeo_Handle_Read(h);
    if (bytes_read > 0) {
      total_bytes += bytes_read;
    } else if (bytes_read == -2) {
      // Connection closed
      break;
    } else if (bytes_read == 0) {
      // Would block, wait a bit
      usleep(10000); // 10ms
      continue;
    } else {
      printf("  ✗ Error reading SSL response\n");
      Seobeo_Handle_Destroy(h);
      return;
    }
  }

  if (total_bytes > 0) {
    printf("  ✓ Received SSL response (%d bytes)\n", total_bytes);

    // Check if we got HTTP response
    if (h->read_buffer_len > 0 && strstr((char*)h->read_buffer, "HTTP/1.1") != NULL) {
      printf("  ✓ Valid HTTPS response received\n");
    } else {
      printf("  ✗ Invalid HTTPS response\n");
    }
  } else {
    printf("  ⚠ No SSL response received (this may be a network issue)\n");
  }

  Seobeo_Handle_Destroy(h);
  printf("  ✓ SSL client handle destroyed\n");
#endif
}

int main() {
  printf("=== Seobeo HTTP Client Tests ===\n\n");

  test_http_client_without_ssl();
  test_http_client_with_ssl();

  printf("\n=== Tests Complete ===\n");
  return 0;
}