view seobeo/seobeo_http_client_test.c @ 83:49b611c808e7

Linked React games to mrjunejune pages.
author June Park <parkjune1995@gmail.com>
date Thu, 01 Jan 2026 12:56:14 -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;
}