view seobeo/tests/seobeo_client_test.c @ 205:e07b4b5a66bb

Bad named files.
author MrJuneJune <me@mrjunejune.com>
date Sun, 15 Feb 2026 11:07:52 -0800
parents c39582f937e5
children
line wrap: on
line source

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

void Test_Simple_Get()
{
  printf("\n=== Test 1: Simple GET Request ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/get");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d %s\n", p_resp->status_code, p_resp->status_text ? p_resp->status_text : "");
    printf("Body length: %zu bytes\n", p_resp->body_length);
    if (p_resp->body && p_resp->body_length > 0)
    {
      printf("Body preview: %.200s...\n", p_resp->body);
    }
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Custom_Headers_HashMap()
{
  printf("\n=== Test 2: Custom Headers using HashMap ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/headers");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Add_Header_Map(p_req, "User-Agent", "Seobeo/1.0");
  Seobeo_Client_Request_Add_Header_Map(p_req, "Accept", "application/json");
  Seobeo_Client_Request_Add_Header_Map(p_req, "X-Custom-Header", "CustomValue");

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d\n", p_resp->status_code);
    if (p_resp->body)
    {
      printf("Response:\n%s\n", p_resp->body);
    }
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Custom_Headers_Array()
{
  printf("\n=== Test 3: Custom Headers using Array ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/headers");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Add_Header_Array(p_req, "User-Agent: Seobeo/1.0 (Array Mode)");
  Seobeo_Client_Request_Add_Header_Array(p_req, "Accept: application/json");
  Seobeo_Client_Request_Add_Header_Array(p_req, "X-Test-Header: TestValue");

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d\n", p_resp->status_code);
    if (p_resp->body)
    {
      printf("Response:\n%s\n", p_resp->body);
    }
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Post_With_Body()
{
  printf("\n=== Test 4: POST Request with Body ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/post");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Set_Method(p_req, "POST");
  Seobeo_Client_Request_Add_Header_Map(p_req, "Content-Type", "application/json");

  const char *json_body = "{\"name\": \"Seobeo\", \"version\": \"1.0\", \"message\": \"Hello from Seobeo HTTP Client!\"}";
  Seobeo_Client_Request_Set_Body(p_req, json_body, 0);

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d\n", p_resp->status_code);
    if (p_resp->body)
    {
      printf("Response:\n%s\n", p_resp->body);
    }
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Follow_Redirects()
{
  printf("\n=== Test 5: Following Redirects ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/redirect/2");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Set_Follow_Redirects(p_req, TRUE, 10);

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Final Status: %d\n", p_resp->status_code);
    printf("Body length: %zu bytes\n", p_resp->body_length);
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Download_File()
{
  printf("\n=== Test 6: Download File ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://mrjunejune.com/public/epi_favicon.svg");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Set_Download_Path(p_req, "downloaded_example.html");

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d\n", p_resp->status_code);
    printf("Downloaded %zu bytes to 'downloaded_example.html'\n", p_resp->body_length);
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Mixed_Headers()
{
  printf("\n=== Test 7: Mixed HashMap and Array Headers ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/headers");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Request_Add_Header_Map(p_req, "User-Agent", "Seobeo/1.0");
  Seobeo_Client_Request_Add_Header_Map(p_req, "Accept", "application/json");

  Seobeo_Client_Request_Add_Header_Array(p_req, "X-Custom-1: Value1");
  Seobeo_Client_Request_Add_Header_Array(p_req, "X-Custom-2: Value2");

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d\n", p_resp->status_code);
    if (p_resp->body)
    {
      printf("Response:\n%s\n", p_resp->body);
    }
    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

void Test_Response_Headers()
{
  printf("\n=== Test 8: Accessing Response Headers ===\n");

  Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create("https://httpbin.org/get");
  if (!p_req)
  {
    printf("Failed to create request\n");
    return;
  }

  Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
  if (p_resp)
  {
    printf("Status: %d %s\n", p_resp->status_code, p_resp->status_text ? p_resp->status_text : "");

    if (p_resp->headers)
    {
      printf("\nResponse Headers:\n");
      size_t count = Dowa_Array_Length(p_resp->headers);
      for (size_t i = 0; i < count; i++)
      {
        printf("  %s: %s\n", p_resp->headers[i].key, p_resp->headers[i].value);
      }
    }

    Seobeo_Client_Response_Destroy(p_resp);
  }
  else
  {
    printf("Request failed\n");
  }

  Seobeo_Client_Request_Destroy(p_req);
}

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

  Test_Simple_Get();
  Test_Custom_Headers_HashMap();
  Test_Custom_Headers_Array();
  Test_Post_With_Body();
  Test_Follow_Redirects();
  Test_Download_File();
  Test_Mixed_Headers();
  Test_Response_Headers();

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