• http server v0.1_http_parse.c


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "mime.h"
    #include "http_common.h"
    
    static const char* methods[]=
    {
        "GET",
        "POST"
    };
    
    
    static int get_version(const char* versionPos, char* version)
    {
        char* versionEnd = NULL;
        int versionlen = 0;
        if(versionPos == NULL || version == NULL)
            return -1;
    
        versionEnd = strstr(versionPos, "
    ");
        versionlen = versionEnd - versionPos;
    
        #if 0
        printf("versionlen = [%d]
    ", versionlen);
        #endif
    
        if(versionlen >10 || versionlen <0)
            return -1;
    
        strncpy(version, versionPos, versionlen);
    
        return 0;    
    }
    
    
    static int get_method(const char* request, EN_REQ_METHOD* method)
    {
        
        if(strncmp(request, methods[HTTP_GET], 3) == 0)
        {
            *method = HTTP_GET;
        }else if(strncmp(request, methods[HTTP_POST], 4) == 0)
        {
            *method = HTTP_POST;
        }else
        {
            *method = HTTP_ELSE;
        }
        
        return (int)(*method);    
    }
    
    
    /*--------------------------------------------------------------
    
    functionname: parse_request
    param:  NA
    return: NA
    author: xxxx
        
    --------------------------------------------------------------*/
    
    int parse_request(const char* request, STR_REQUEST* result)
    {
        int method=0;    
        int urilen =0;
        char* version_pos = NULL;
        if(request == NULL || result == NULL)
            return -1;
        
        method =get_method(request, &(result->method));    
        //only apply GET POST
        if(method == HTTP_ELSE)
            return -1;
    
        //-----------------get URI---------------------------------    
        version_pos = strstr(request, "HTTP");
        //malloc uri
        result->URI = (char*)malloc(urilen + WEBAPP_DIR_LEN);
        //
        if(result->URI == NULL)
        {
            perror("malloc failed");
            return -1;
        }
    
        bzero(result->URI, urilen);
        strncpy(result->URI, WEBAPP_DIR, WEBAPP_DIR_LEN);
        //
        if(result->method == HTTP_GET)
        {
            urilen = version_pos - (request+4) -1;    
            strncpy((result->URI)+WEBAPP_DIR_LEN, request + 4, urilen);
        }
    
        if(result->method == HTTP_POST)
        {
            urilen = version_pos - (request + 5) -1;
            strncpy(result->URI+WEBAPP_DIR_LEN, request + 5, urilen);
        }
        
        //---------------------------------------------------------
        
        if(get_version(version_pos, result->http_version) == -1)
            return -1; 
    
        return 0;    
    }
  • 相关阅读:
    Ngui使用随心记
    Ngui分辨率适配
    最大堆(优先队列)
    循环队列 & 栈的共用空间
    C#顺序表 & 单向链表(无头)
    IntelliJ Idea 常用快捷键列表
    写增删改查遇到的小问题总结
    用JS解决html页面间获取context-path问题
    html 页面如何获得url中的参数
    @RequestBody和@RequestParam区别
  • 原文地址:https://www.cnblogs.com/unixshell/p/3519059.html
Copyright © 2020-2023  润新知