view playground/main.c @ 18:fa2b8af609d9

[Seobeo] Fixed a bug with pathing. Support SSL.
author June Park <parkjune1995@gmail.com>
date Mon, 06 Oct 2025 08:21:34 -0700
parents d97ec3ded2ae
children 342726584be2
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define INITIAL_BUFFER_CAPACITY 8192

void init_openssl()
{
    SSL_load_error_strings();
    OpenSSL_add_ssl_algorithms();
}

int main(void)
{
    const char *host = "www.google.com";
    const char *port = "443";

    struct addrinfo hints = {0}, *res;
    hints.ai_family   = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    if (getaddrinfo(host, port, &hints, &res) != 0)
    {
        perror("getaddrinfo");
        return 1;
    }

    int sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sockfd < 0)
    {
        perror("socket");
        return 1;
    }

    if (connect(sockfd, res->ai_addr, res->ai_addrlen) != 0)
    {
        perror("connect");
        return 1;
    }

    freeaddrinfo(res);

    init_openssl();
    SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
    SSL_CTX_set_default_verify_paths(ctx);

    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sockfd);

    // ✅ use real hostname for SNI
    SSL_set_tlsext_host_name(ssl, host);

    // ✅ perform blocking handshake for simplicity
    fcntl(sockfd, F_SETFL, 0);

    if (SSL_connect(ssl) != 1)
    {
      fprintf(stderr, "SSL_connect failed\n");
      ERR_print_errors_fp(stderr);
      return 1;
    }

    printf("✅ SSL handshake successful!\n");

    // send a basic HTTP request
    const char *req =
        "GET / HTTP/1.1\r\n"
        "Host: www.google.com\r\n"
        "Connection: close\r\n\r\n";
    SSL_write(ssl, req, strlen(req));

    char buf[INITIAL_BUFFER_CAPACITY];
    int bytes;

    while ((bytes = SSL_read(ssl, buf, sizeof(buf) - 1)) > 0)
    {
        buf[bytes] = '\0';
        printf("%s", buf);
    }

    SSL_shutdown(ssl);
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    close(sockfd);
    EVP_cleanup();
    return 0;
}