BOA服务器移植——cgi_header: unable to find LFLF

238 阅读2分钟

报错

功能是前端请求一张图片,但总是报错,502 Bad Gateway The CGI was not CGI/1.1 compliant.

<HTML><HEAD><TITLE>502 Bad Gateway</TITLE></HEAD> <BODY><H1>502 Bad Gateway</H1> The CGI was not CGI/1.1 compliant. </BODY></HTML>

/var/log/boa/error_log

[06/May/2025:06:36:39 +0000] cgi_header: unable to find LFLF

cgi-bin程序

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define IMAGE_FILE "/var/www/predict_image.jpg"

int main() {
    int fd;
    char buffer[1024];
    ssize_t bytes_read;
    off_t file_size;

    // 打开图片文件
    fd = open(IMAGE_FILE, O_RDONLY);
    if (fd == -1) {
        // 如果文件打开失败,返回错误信息
        fprintf(stderr, "Failed to open image file: %s\n", IMAGE_FILE);
        return 1;
    }

    // 获取文件大小
    file_size = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET); // 重置文件指针到文件开头

    // 设置 HTTP 响应头
    printf("Content-Type: image/jpeg\r\n");
    printf("Content-Length: %ld\r\n\r\n", file_size);

    // 读取图片文件内容并发送到客户端
    while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
        write(STDOUT_FILENO, buffer, bytes_read);
    }

    // 关闭文件描述符
    close(fd);
    return 0;
}

解决

看了网上一大把对这个问题的解决办法,试了遍,没卵用,全都是弟弟,说不到点子上

还得要我亲自下场,深入代码,仔细分析

发现人家源码应该没问题,是IO缓冲的问题,printf不会立马写,而write会立马写,所以就会出现这种情况:write写的内容反而在printf前面,或者printf写的内容压根没进内核,还在库中的buffer里,导致boa解析出错

知道这个原因后,不用printf,全都用write,问题解决,牛不牛逼,全网独我一份,网上其它的解决办法全是垃圾

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define IMAGE_FILE "/var/www/predict_image.jpg"

int main() {
    int fd;
    char buffer[1024];
    ssize_t bytes_read;
    off_t file_size;

    // 打开图片文件
    fd = open(IMAGE_FILE, O_RDONLY);
    if (fd == -1) {
        // 如果文件打开失败,返回错误信息
        fprintf(stderr, "Failed to open image file: %s\n", IMAGE_FILE);
        return 1;
    }

    // 获取文件大小
    file_size = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET); // 重置文件指针到文件开头

    // 设置 HTTP 响应头
    snprintf(buffer, sizeof(buffer), "Content-Type: image/jpeg\r\n");
    write(STDOUT_FILENO, buffer, strlen(buffer));

    snprintf(buffer, sizeof(buffer), "Content-Length: %ld\r\n\r\n", file_size);
    write(STDOUT_FILENO, buffer, strlen(buffer));

    // 读取图片文件内容并发送到客户端
    while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
        write(STDOUT_FILENO, buffer, bytes_read);
    }

    // 关闭文件描述符
    close(fd);
    return 0;
}