HTTP協議實用-日期操作CGI程序

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

#define SIZE (1024 * 10)

class Date
{
public :
    Date(int year = 2000, int mounth = 1, int day = 1)
        : _year(year)
        , _mounth(mounth)
        , _day(day)
    {
    }
    
    bool operator<(const Date& d)
    {
        if (_year < d._year){
            return true;
        }
        else{
            if (_year == d._year && _mounth < d._mounth){
                return true;
            }
            else{
                if (_year == d._year && _mounth == d._mounth && _day < d._day){
                    return true;
                }
            }
        }
        return false;
    }

    Date& operator++()
    {
        _day++;
        if (_day > getMounthDays(_year, _mounth)){
            _day = 1;
            _mounth++;
            if (_mounth > 12){
                _mounth = 1;
                _year++;
            }
        }
        return *this;
    }
    
    bool operator!=(const Date& d)
    {
        if (_year == d._year && _mounth == d._mounth && _day == d._day){
            return false;
        }
        return true;
    }

    int operator-(const Date& d)
    {
        if (this == &d){
            return 0;
        }
        int count = 0;
        Date min(d);
        Date max(*this);
        if (max < min){
            min = *this;
            max = d;
            while (min != max){
                ++min;
                --count;
            }
        }
        else{
            while (min != max){
                ++min;
                ++count;
            }
        }
        return count;
    }

private :
    bool isLoopYear(int year)
    {
        if (year % 400 == 0){
            return true;
        }
        else if (year % 4 == 0 && year % 100 != 0){
            return true;
        }
        return false;
    }

    int getMounthDays(int year, int mounth)
    {
        int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (isLoopYear(year) && mounth == 2){
            return 29;
        }
        return days[mounth];
    }

private:
    int _year;
    int _mounth;
    int _day;
};

int get_http_request(char* query)
{
    //1.獲取到方法
    char* method = getenv("REQUEST_METHOD");
    if (method == NULL){
        fprintf(stderr, "REQUEST_METHOD failed\n");
        return -1;
    }
    //2.如果是GET方法,獲得query_string
    if (strcmp(method, "GET") == 0){
        char* query_string = getenv("QUERY_STRING");
        if (query_string == NULL){
            fprintf(stderr, "QUERY_STRING failed\n");
            return -1;
        }
        strcpy(query, query_string);
    }
    //3.如果是POST方法,獲得content_length和body
    return 0;
}

int main()
{
    //1.基於CGI協議獲取到需要的參數
    char query[SIZE] = {0};
    int ret = get_http_request(query);
    if (ret < 0){
        return -1;
    }
    //2根據業務邏輯得到需要的結果
    int year1, year2, mounth1, mounth2, day1, day2;
    sscanf(query, "year=%d&mounth=%d&day=%d&year=%d&mounth=%d&day=%d", &year1, &mounth1, &day1, &year2, &mounth2, &day2);
    Date d1(year1, mounth1, day1);
    Date d2(year2, mounth2, day2);
    int result = d2 - d1;
    //3.將結果構造爲HTML,寫回到標準輸入中
    printf("<html><head><meta charset = \"utf-8\"></head><body><h1>相差:%d</h1><a href=\"http://39.106.164.95:9000/index.html\">返回首頁</a></body></html>", result);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章