• 大小: 19KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-23
  • 语言: C/C++
  • 标签: HTTP  chunked  C语言  demo  

资源简介

一个用C语言实现的解析HTTP chunked方式传输的数据包的演示程序

资源截图

代码片段和文件信息

/*
 *  dechunk.c
 *  http_chunk_demo
 *
 *  Created by I MAC on 11-9-7.
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
 *
 */

#include “dechunk.h“
#include 
#include 

#define DC_MIN(x y) (x) > (y) ? (y) : (x)

static char     *g_buff_out     = NULL;
static char     *g_buff_pt      = NULL;

static size_t   g_buff_outlen   = 0;
static size_t   g_chunk_len     = 0;
static size_t   g_chunk_read    = 0;

static int      g_is_running    = 0;
static int      g_is_first      = 1;
static int      g_is_chunkbegin = 0;

void *memstr(void *src size_t src_len char *sub)
{
    if (NULL == src || NULL == sub || src_len < strlen(sub))
    {
        return NULL;
    }
    
    char *p     = src;
    char *q     = sub;
    size_t indx    = src_len;
    size_t sub_len = strlen(sub);
    
    while (indx > 0)
    {
        int i = 0;
        
        while (i < sub_len)
        {
            char cp = *(p + i);
            char cq = *(q + i);
            
            // case ignore
            if (cq >= ‘A‘ && cq <= ‘Z‘)
            {
                cq |= 0x20;
            }
            
            if (cp >= ‘A‘ && cp <= ‘Z‘)
            {
                cp |= 0x20;
            }
            
            if (cq != cp)
            {
                break;
            }
            
            i++;
        }
        
        if (i == sub_len)
        {
            return p;
        }
        
        p++;
        indx--;
    }
    
    return NULL;
}

int dechunk_init()
{
    if (g_is_running)
    {
        return DCE_ISRUNNING;
    }
    
    g_buff_out      = NULL;
    g_buff_pt       = NULL;
    
    g_buff_outlen   = 0;
    g_chunk_len     = 0;
    g_chunk_read    = 0;
    
    g_is_running    = 1;
    g_is_first      = 1;
    g_is_chunkbegin = 0;
    
    return DCE_OK;
}

int dechunk(void *input size_t inlen)
{
    if (!g_is_running)
    {
        return DCE_LOCK;
    }
    
    if (NULL == input || inlen <= 0)
    {
        return DCE_ARGUMENT;
    }
    
    void *data_start = input;
    size_t data_len = inlen;
    
    if (g_is_first)
    {
        data_start = memstr(data_start data_len “\r\n\r\n“);
        if (NULL == data_start)
        {
            return DCE_FORMAT;
        }
        
        data_start += 4;
        data_len -= (data_start - input);
        
        g_is_first = 0;
    }
    
    if (!g_is_chunkbegin)
    {
        char *stmp = data_start;
        int itmp = 0;
        
        sscanf(stmp “%x“ &itmp);
        itmp = (itmp > 0 ? itmp - 2 : itmp);          // exclude the terminate “\r\n“
        
        data_start = memstr(stmp data_len “\r\n“);
        data_start += 2;    // strlen(“\r\n“)
        
        data_len        -=  (data_start - (void *)stmp);
        g_chunk_len     =   itmp;
        g_buff_outlen   +=  g_chunk_len;
        g_is_chunkbegin =   1;
        g_chunk_read    =   0;
        
        if (g_chunk_len > 0 && 0 != g_buff_outlen)
        {
            if (NULL == g_buf

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2011-09-07 18:27  http_chunk_demo\
     文件        4548  2011-09-07 17:44  http_chunk_demo\dechunk.c
     目录           0  2011-09-07 18:27  __MACOSX\
     目录           0  2011-09-07 18:27  __MACOSX\http_chunk_demo\
     文件         171  2011-09-07 17:44  __MACOSX\http_chunk_demo\._dechunk.c
     文件         590  2011-09-07 17:36  http_chunk_demo\dechunk.h
     文件         171  2011-09-07 17:36  __MACOSX\http_chunk_demo\._dechunk.h
     文件        3057  2011-09-07 08:44  http_chunk_demo\http_chunk_demo.1
     目录           0  2011-09-07 18:27  http_chunk_demo\http_chunk_demo.xcodeproj\
     文件       40864  2011-09-07 18:27  http_chunk_demo\http_chunk_demo.xcodeproj\imac1.mode1v3
     文件       48849  2011-09-07 18:27  http_chunk_demo\http_chunk_demo.xcodeproj\imac1.pbxuser
     文件        7653  2011-09-07 18:27  http_chunk_demo\http_chunk_demo.xcodeproj\project.pbxproj
     文件        5153  2011-09-07 18:27  http_chunk_demo\main.c
     文件         171  2011-09-07 18:27  __MACOSX\http_chunk_demo\._main.c

评论

共有 条评论