MST

星途 面试题库

面试题:C语言实现简单HTTP请求解析

在Linux环境下,用C语言编写一个函数,能够解析简单的HTTP GET请求,提取出请求的URL和头部信息。假设请求格式为标准的HTTP/1.1格式,头部信息每行以\r\n分隔,整个请求以\r\n\r\n结尾。
48.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_REQUEST_SIZE 1024
#define MAX_HEADERS 10
#define MAX_HEADER_LENGTH 100
#define MAX_URL_LENGTH 200

void parseHttpGetRequest(const char *request, char *url, char (*headers)[MAX_HEADER_LENGTH]) {
    const char *p = request;
    // 提取URL
    if (strncmp(p, "GET ", 4) == 0) {
        p += 4;
        const char *endUrl = strstr(p, " HTTP/1.1\r\n");
        if (endUrl) {
            size_t urlLength = endUrl - p;
            if (urlLength < MAX_URL_LENGTH) {
                strncpy(url, p, urlLength);
                url[urlLength] = '\0';
            }
        }
    }

    // 提取头部信息
    p = strstr(request, "\r\n");
    if (p) {
        p += 2;
        int headerCount = 0;
        while (headerCount < MAX_HEADERS && strncmp(p, "\r\n", 2) != 0) {
            const char *endHeader = strstr(p, "\r\n");
            if (endHeader) {
                size_t headerLength = endHeader - p;
                if (headerLength < MAX_HEADER_LENGTH) {
                    strncpy(headers[headerCount], p, headerLength);
                    headers[headerCount][headerLength] = '\0';
                    headerCount++;
                }
            }
            p = endHeader + 2;
        }
    }
}

你可以这样调用这个函数:

int main() {
    char request[MAX_REQUEST_SIZE] = "GET /index.html HTTP/1.1\r\n"
                                     "Host: example.com\r\n"
                                     "User - Agent: Mozilla/5.0\r\n"
                                     "\r\n";
    char url[MAX_URL_LENGTH];
    char headers[MAX_HEADERS][MAX_HEADER_LENGTH];

    parseHttpGetRequest(request, url, headers);

    printf("URL: %s\n", url);
    for (int i = 0; i < MAX_HEADERS && headers[i][0] != '\0'; i++) {
        printf("Header %d: %s\n", i + 1, headers[i]);
    }

    return 0;
}