如何使用c语言解析httppost请求

2023-05-16

头文件

#ifndef _UPLOAD
#define _UPLOAD

#include "fastcgi/fcgiapp.h"

//#include "sysinc.h"
#ifdef _WIN32
/*! \def GRCALL
*  the calling convention of functions exported by modules.
*/
#	define GRCALL __stdcall
#	define GRINLINE __inline
#else
#	define GRINLINE inline

/*! \def GRCALL
*  the calling convention of functions exported by modules.
*/
#	if defined(__CYGWIN__)
#		define GRCALL __stdcall
#	else
#		define __stdcall
#		define GRCALL
#	endif
#endif


#define EUPLOAD_SUCCESS 0 
#define EUPLOAD_NO_DATA -1
#define EUPLOAD_READ    -2
#define EUPLOAD_WRITE   -3


#ifdef __cpluscplus
extern "C" {
#endif

int GRCALL upload_file_save_as(FCGX_Stream* in,FCGX_Stream* out, FCGX_ParamArray envp,const char *save_path,char(* filePath)[260]);

int GRCALL upload_file_save_as(const char *save_path);

#ifdef __cpluscplus
}
#endif


#endif


cpp

#include "stdafx.h"
#include "fastcgi/upload.h"
//#include "logger.h"
#include "fastcgi/fcgi_stdio.h"
#include "string.h"
#include <stdlib.h>
#include <windows.h>

#define DEAL_BUF_LEN 1024
#define SIGN_CODE_LEN 100
#define FILE_NAME_LEN 64

enum
{
    STATE_START,
    STATE_GET_SIGN_CODE,
    STATE_GET_FILE_NAME,
    STATE_GET_FILE_START,
    STATE_GET_FILE_CONTENT,
    STATE_CHECK_END,
    STATE_END
};


int GRCALL upload_file_save_as(FCGX_Stream* in, FCGX_Stream* out, FCGX_ParamArray envp, const char *saveas,char(* saveName)[260])
{
	FILE *fp=NULL;
	int getState = STATE_START;
		// uploaded file content length 
	int contentLength;
	int nowReadLen;
	int signCodeLen;
	int tmpLen;
	char *nowReadP;
	char *nowWriteP = NULL;
	char dealBuf[DEAL_BUF_LEN];
	// http boundary 
	char signCode[SIGN_CODE_LEN];
	char tmpSignCode[SIGN_CODE_LEN];
	char fileName[FILE_NAME_LEN];
	memset(dealBuf, '0', DEAL_BUF_LEN);
	memset(signCode, '0', SIGN_CODE_LEN);
	memset(fileName, '0', FILE_NAME_LEN);
	nowReadLen = 0;
	int fileNum = 0;

	//SYSTEMTIME sys;
	//GetLocalTime(&sys);
	//FCGX_FPrintF(out, " before 1:  %02d:%02d.%03d 星期%1d ",  sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);


	if ((char *)FCGX_GetParam("CONTENT_LENGTH", envp) != NULL)
	{
		contentLength = atoi((char *)FCGX_GetParam("CONTENT_LENGTH", envp));
		FCGX_FPrintF(out, "CONTENT_LENGTH %d \n", contentLength);
	}
	else
	{
		FCGX_FPrintF(out, "EUPLOAD_NO_DATA\n");
		return EUPLOAD_NO_DATA;
	}

	while (contentLength > 0)
	{
		if (contentLength >= DEAL_BUF_LEN)
		{
			nowReadLen = DEAL_BUF_LEN;
		}
		else
		{
			nowReadLen = contentLength;
		}
		contentLength -= nowReadLen;
		//if (FCGI_fread(dealBuf, sizeof(char), nowReadLen, FCGI_stdin) != (size_t)nowReadLen)
		if (FCGX_GetStr(dealBuf, nowReadLen, in) != (size_t)nowReadLen)
		{
			//log_error("read error %d", nowReadLen);
			FCGX_FPrintF(out, "read error %d \n", nowReadLen);
			FCGX_FPrintF(out, "actual read %d \n", fread(dealBuf, sizeof(char), nowReadLen, FCGI_stdin));
			return EUPLOAD_READ;
		}
		nowReadP = dealBuf;
		//FCGX_FPrintF(out, "content is %s \n", dealBuf);
		/*while (nowReadLen > 0)
		{
			FCGX_FPrintF(out, "%c \n", *nowReadP);
			nowReadP++;
			nowReadLen--;
		}*/
		while  (nowReadLen > 0)
		{
			switch (getState)
			{
			case STATE_START:
				nowWriteP = signCode;
				getState = STATE_GET_SIGN_CODE;
			case STATE_GET_SIGN_CODE:
				if (strncmp(nowReadP, "\r\n", 2) == 0)
				{
					//FCGX_FPrintF(out, "## signCode is %s", signCode);
					signCodeLen = nowWriteP - signCode;
					//FCGX_FPrintF(out, "## signCode LENGTH is %d", signCodeLen);
					nowReadP++;
					nowReadLen--;
					*nowWriteP = 0;
					getState = STATE_GET_FILE_NAME;
					
				}
				else
				{
					*nowWriteP = *nowReadP;
					nowWriteP++;
				}
				break;
			case STATE_GET_FILE_NAME:
				if (strncmp(nowReadP, "filename=", strlen("filename=")) == 0)
				{
					nowReadP += strlen("filename=");
					nowReadLen -= strlen("filename=");
					nowWriteP = fileName + strlen(saveas);
					memset(fileName, '0', FILE_NAME_LEN);
					while (*nowReadP != '\r')
					{
						if (*nowReadP == '\\' || *nowReadP == '/')
						{
							nowWriteP = fileName + strlen(saveas);
						}
						else if (*nowReadP != '\"')
						{
							*nowWriteP = *nowReadP;
							nowWriteP++;
						}
						nowReadP++;
						nowReadLen--;
						if (nowReadLen <= 0)
							break;
					}
					*nowWriteP = 0;
					nowReadP++;
					nowReadLen--;
					getState = STATE_GET_FILE_START;
					memcpy(fileName, saveas, strlen(saveas));
					//
					if (fileNum > 1)
						fileNum = 1;
					sprintf(saveName[fileNum], "%s",fileName);
					//FCGX_FPrintF(out, "open file %s ", fileName);
					if ((fp = fopen(fileName, "wb")) == NULL)
					{
						//log_error("open file %s error %d", fileName, errno);
						
						FCGX_FPrintF(out, "open file %s error %d", fileName, errno);
						return EUPLOAD_WRITE;
					}
					else
					{
						fileNum++;
					}
				}
				break;
			case STATE_GET_FILE_START:
				if (strncmp(nowReadP, "\r\n\r\n", 4) == 0)
				{
					nowReadP += 3;
					nowReadLen -= 3;
					getState = STATE_GET_FILE_CONTENT;
				}
				break;
			case STATE_GET_FILE_CONTENT:
				if (*nowReadP != '\r')
				{
					//fputc(*nowReadP, fp);
					fwrite(nowReadP, sizeof(char), 1, fp);
				}
				else
				{
					
					if (nowReadLen >= (signCodeLen + 2)) //\r\n=2
					{

						if (strncmp(nowReadP + 2, signCode, signCodeLen) == 0)
						{
							
							//FCGX_FPrintF(out, "STATE_GET_FILE_CONTENT and end:%d ,signCodeLen is %d ", nowReadLen, signCodeLen);
							
							//FCGX_FPrintF(out, "nowReadp: %c  ", *(nowReadP + 2 + signCodeLen));
							//FCGX_FPrintF(out, "nowReadp: %c  ", *(nowReadP + 2 + signCodeLen+1));
							//FCGX_FPrintF(out, "nowReadp: %c  ", *(nowReadP + 2 + signCodeLen+2));
	
							//getState = STATE_END;
							//nowReadLen = 1;
							
							
							if (nowReadLen >= (signCodeLen + 4) && strncmp(nowReadP + 2 + signCodeLen, "--", 2) == 0)//真正的结尾
							{
								//FCGX_FPrintF(out, "## end ##  ");
								getState = STATE_END;
								nowReadLen = 1;
							}
							//else if(nowReadLen<(signCodeLen + 4) )//刚好到boundary后面的-未读到时,break
							//{
							//	break;
							//}
							
							else
							{
								//FCGX_FPrintF(out, "try to close file and start another file");
								if (fp != NULL)
								{
									FCGX_FPrintF(out, "close file and start another file");
									fclose(fp);
									fp = NULL;
								}
								

								getState = STATE_GET_FILE_NAME;
								//getState = STATE_START;
								//memset(signCode, 0, SIGN_CODE_LEN);

								//FCGX_FPrintF(out, "nowReadp ==r## and goto START");
							}
								
							//getState = STATE_END;
							//nowReadLen = 1;
						}
						else
						{
							//fputc(*nowReadP, fp);
							fwrite(nowReadP, sizeof(char), 1, fp);
							//FCGX_FPrintF(out, "%s", nowReadP);
						}
					}
					else
					{
						getState = STATE_CHECK_END;
						nowWriteP = tmpSignCode;
						*nowWriteP = *nowReadP;
						nowWriteP++;
						tmpLen = 1;


						//FCGX_FPrintF(out, "check end nowRadp ==r##");
					}
				}
				break;
			case STATE_CHECK_END:
				if (*nowReadP != '\r')
				{
					if (tmpLen < signCodeLen + 2)
					{
						*nowWriteP = *nowReadP;
						nowWriteP++;
						tmpLen++;
						if (tmpLen == signCodeLen + 2)
						{
							*nowWriteP = 0;
							//FCGX_FPrintF(out, "tmpSignCode is %s \n", tmpSignCode);
							if ((tmpSignCode[1] == '\n') && (strncmp(tmpSignCode + 2, signCode, signCodeLen) == 0))
							{
								
								/*FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %02x  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %02x  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								    getState = STATE_END;
									nowReadLen = 1;
								*/
								/*
								FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %02x  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %02x  ", *nowReadP);
								nowReadP++;
								FCGX_FPrintF(out, "nowReadp: %c  ", *nowReadP);
								nowReadP -=3;
								*/
								
									
								nowReadP++;
								nowReadLen--;
								//if (nowReadLen >= (signCodeLen + 4) && strncmp(nowReadP + 2 + signCodeLen, "--", 2) == 0)//真正的结尾
								if (nowReadLen >= 2 && strncmp(nowReadP, "--", 2) == 0)
								{
									//FCGX_FPrintF(out, "nowReadp ==r## and goto END");
									//FCGX_FPrintF(out, "### check end,signCodeLen: %d,nowReadLen:%d", signCodeLen, nowReadLen);
									getState = STATE_END;
									nowReadLen = 1;
									
								}
								//else if(nowReadLen<2)//刚好到boundary后面的--未读到时,break
								//{
								//	break;
								//}
								else
								{
									if (fp != NULL)
									{
										try {
											FCGX_FPrintF(out, "close file checkend");
											fclose(fp);
										}
										catch (...) {
										}
									}
									getState = STATE_GET_FILE_NAME;
									
									//getState = STATE_START;
									//memset(signCode, 0, SIGN_CODE_LEN);

									//FCGX_FPrintF(out, "nowReadp ==r## and goto START");
								}
								
								//getState = STATE_END;
								//nowReadLen = 1;
							}
							else
							{
								//fprintf(fp,tmpSignCode);
								fwrite(tmpSignCode, sizeof(char), tmpLen, fp);
								getState = STATE_GET_FILE_CONTENT;
								//FCGX_FPrintF(out, "check end and get fileContent,tempSignCode: %s", tmpSignCode);
								//FCGX_FPrintF(out, "checkend and not end \n");
							}
						}
					}
				}
				else
				{
					*nowWriteP = 0;
					//fprintf(fp,tmpSignCode);
					fwrite(tmpSignCode, sizeof(char), tmpLen, fp);
					nowWriteP = tmpSignCode;
					*nowWriteP = *nowReadP;
					nowWriteP++;
					tmpLen = 1;
					FCGX_FPrintF(out, "checkend and nowReadP == r \n");
				}
				break;
			case STATE_END:
				nowReadLen = 1;
				//FCGX_FPrintF(out, "state  end \n");
				break;
			default:break;
			}
			if (getState != STATE_START)
			{
				nowReadLen--;
				nowReadP++;
			}
			else
			{
				nowReadLen-=2;
				nowReadP+=2;
			}
			
		}
	}


	//add for two picture by luodaliang
	if (fp != NULL)
	{
		FCGX_FPrintF(out, "close file end");
		fclose(fp);	
	}

	//GetLocalTime(&sys);
	//FCGX_FPrintF(out, " before 5:  %02d:%02d.%03d 星期%1d ", sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);

	return EUPLOAD_SUCCESS;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用c语言解析httppost请求 的相关文章

随机推荐

  • Spark学习总结

    第1章 Spark 概述 1 1 Spark是什么 Spark 是一种基于内存的快速 通用 可扩展的大数据分析计算引擎 主要用于数据计算 xff0c 经常被认为是Hadoop框架的升级版 1 2 Spark 和Hadoop的缘分 组成 Ha
  • RTMP 推送H265的实现(推流端、服务器、播放端)ffmpeg 播放H265

    众所周知的原因原生的RTMP只支持H264 并不支持H265的传输 xff0c 之前的项目基于海思3531DV200平台的多路输入 多路输出 基于FFMpeg 拉RTSP的流 然后通过海思硬件解码然后在编码成较小的分辨率 通过RTMP推流到
  • Visio画UML类图

    用Visio画UML类图 1 首先创建一个类图 接下来我们要做一下准备工作 xff0c 因为我们这里用了PSDK中的POINT类型 xff0c 在种数据类型在visio数据类型中找不到 xff0c 所以我们先得追加这个数据类型 为了便于管理
  • 二维数组的输入、输出、转置

    这里我将在二维数组中的一些基本操作进行一次整理 xff1a 编码思路 xff1a 1 inputTwoArry 输入函数 用于二维数组的初始化 xff08 也就是赋值 xff09 实现 xff1a 给函数中传入要初始化数组的地址 xff0c
  • 输入一句话,找出其中最长的单词,并输出

    理解题意 xff1a 1 先输入一句话 2 在这句话中找到最长的那个单词并输出显示 这个题是我们老师上课的时候给我们留的作业 因为刚好学过了二维数组所以果断采用二维数组来解题 个人觉得 xff0c 这个逻辑思路其实相较一维数组来解会更简单一
  • C语言:将学生信息存储到文件中

    描述 xff1a 从键盘输入两个学生的有关数据 xff0c 然后把它们转存到磁盘文件上去 基础知识点 xff1a 1 定义结构体变量 xff0c 存储复杂一点的变量 xff08 对象 xff09 2 用到了C语言中对文件的处理 3 排序 文
  • Maven的安装、配置以及在Eclipse中安装maven插件

    一 需要准备的东西 xff08 原文链接 xff09 1 首先确保安装了JDK xff0c 并且成功配置了JDK的环境变量 2 已安装Eclipse 3 Maven程序包 二 maven下载与安装 1 前往https maven apach
  • ros多机通信配置

    ros多机通信配置 xff0c 以两台计算机为例 xff0c 主机hostname为master从机hostname为slaver 1 在主机和从机 etc hosts内添加ip和hostname 例如两台计算机ip和hostname分别为
  • RS422接线方法

  • ORB-SLAM2的编译运行以及TUM数据集测试

    近段时间一直在学习高翔博士的 视觉SLAM十四讲 xff0c 学了以后发现自己欠缺的东西实在太多 xff0c 好多都需要深入系统的学习 ORB SLAM2是一套完整的SLAM方案 xff0c 提供了单目 xff0c 双目和RGB D三种接口
  • 【VINS论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

    回到目录 写在前面 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU紧耦合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09
  • 视觉SLAM十四讲(第二版)章节总结+课后习题分析

    感谢博主nullwh 的分享 xff0c 原文链接 视觉SLAM十四讲 视觉SLAM十四讲 第二版 笔记及课后习题 xff08 第一讲 xff09 视觉SLAM十四讲 第二版 笔记及课后习题 xff08 第二讲 xff09 视觉SLAM十四
  • FFMPEG 编解码失败 non-existing PPS 0 referenced

    最近在尝试用ffmpeg进行编解码 大部分的rtsp拉流正常 编解码正常 但是有的rtsp不能解码 提示如下 xff1a 后来把把packet数据打印出来发现是没有sps pps信息 导致 ffmpeg不能正常解码 程序里面 经过测试 把
  • ROS主从机配置

    目标 xff1a 小车上运行SLAM算法 xff0c 在PC上使用rviz可视化观察 第一步 xff1a 分别在两台机器上使用 hostname 指令查看用户名 ifconfig 指令查看ip地址 wlp3s0是我的pc的无线网卡 xff0
  • Docker入门指南

    https yeasy gitbook io docker practice
  • STL迭代器模版详解

    1 STL iterator迭代器 STL xff08 Standard Template Library xff0c 标准模板库 是惠普实验室开发的一系列软件的统称 它是由Alexander Stepanov Meng Lee和David
  • 4种YOLO目标检测的C++和Python两种版本实现

    本文原创首发于极市平台公众号 xff0c 如需转载请私信作者 2020年 xff0c 新出了几个新版本的YOLO目标检测 xff0c 在微信朋友圈里转发的最多的有YOLOv4 xff0c Yolo Fastest xff0c YOLObil
  • Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈 Task 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity 这些 Activity 按照各自的打开顺序排列在堆栈 xff08 即 返回栈 xff09 中 其实就是以栈的结构 先进后出 将依次打
  • 什么是标记化?令牌?

    什么是标记化 xff1f 标记化就是 xff1a 将敏感数据元素 xff08 例如银行帐号 xff09 替换为非敏感替代项 xff08 称为令牌 xff09 令牌是一个随机数据字符串 xff0c 没有基本或可利用的值或含义 它是一个唯一的标
  • 如何使用c语言解析httppost请求

    头文件 ifndef UPLOAD define UPLOAD include 34 fastcgi fcgiapp h 34 include 34 sysinc h 34 ifdef WIN32 def GRCALL the callin