[HTTP/C++]请求体form-data解析

/ 4,100评论 / 17450阅读 / 11点赞

预备知识

URL编解码

请求体编码格式


form-data格式

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="myfile"; filename="hello.gif" filename*=UTF-8''hello.gif
Content-Type: image/gif


{二进制数据}
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="mytext"

coolight
------WebKitFormBoundary7MA4YWxkTrZu0gW--
--{boundary}(\r\n)
Content-Disposition: form-data; name="{key}"(\r\n)
(\r\n)
{value}(\r\n)
--{boundary}
--{boundary}(\r\n)
Content-Disposition: form-data; name="{key}"; filename="{filename}"(\r\n)[; filename*={编码方式}''{对应编码的filename}]
Content-Type: {文件格式}(\r\n)
(\r\n)
(\r\n)
{二进制数据}(\r\n)
--{boundary}

c++解析

这里使用正则表达式标准库匹配,并使用string_view减小开销。

#include <regex>
#include <string_view>
#include <map>

using std::string;
using std::multimap;
using std::string_view;

namespace mimicry {
	struct Http_form_data_s {
		bool isFile = false;	//是否为文件,否的话fileName和fileType是无效的
		//注意:fileName可能会包含./ ../等路径信息,此时可能会有一些危险的操作,建议截取最后一个/之后的文件名或自行命名
		std::string fileName;
		std::string fileName_CharEncoding;
		//有时可能文件名会乱码,因此请求中会有指定编码的文件名,对应字段 fileName*
		std::string fileName_;
		std::string fileType;
		std::string value;
	};

std::multimap<std::string, mimicry::Http_form_data_s>
read_form_data(const std::string& in_bound, const std::string& in_data) {
	std::multimap<std::string, mimicry::Http_form_data_s> remap;
	string_view view{ in_data };
	std::regex reg_name{"\\r\\nContent-Disposition:\\s*form-data;\\s*name=\"(.*)\"(?:\\s*;\\s*filename=\"(.*)\"(?:\\s*;\\s*filename\\*=(.*)''(.*))?\\r\\nContent-Type:\\s*(.*))?\\r\\n\\r\\n"};
	string find_bound = "--" + in_bound;
	mimicry::Http_form_data_s data;
	size_t pos = 0, pos_2 = 0;
	if ((pos = view.find(find_bound)) != string::npos) {
		pos += find_bound.size();
		for (;(pos_2 = view.find(find_bound, pos)) != string::npos;) {
			string_view block = view.substr(pos, pos_2 - pos);	//截取两个bound之间的内容
			std::match_results<string_view::const_iterator> block_match_view;
			if (std::regex_search(block.begin(), block.end(), block_match_view, reg_name)) {	//匹配 name 和可能存在的 filename
				data.fileName = block_match_view.str(2);
				data.fileName_CharEncoding = block_match_view.str(3);
				data.fileName_ = block_match_view.str(4);
				data.fileType = block_match_view.str(5);
				data.isFile = data.fileName.size() > 0;
				const char* str_p = &(* (block_match_view[0].second));
				size_t len = block.end() - 2 - block_match_view[0].second;
				//const string_view var_view = string_view{ block_match_view[0].second, block.end() - 2 };
				data.value = string(str_p, len);
				remap.insert({ block_match_view.str(1), data });
			}
			pos = pos_2 + find_bound.size();
		}
	}
	return remap;
}
};

其他

boundary的来历

form-data和Birnary的选择

  1. CurtisTraup说道:

    rybpharm canada buy rybelsus buy rybelsus rybpharm

  2. Robertmep说道:

    http://furpharm.com/# buy lasix fur pharm

  3. DennisBob说道:

    GabaPharm Gabapentin: cheapest Gabapentin GabaPharm – buy gabapentin india

  4. Тут можно преобрести сейф несгораемый сейф огнестойкий цена

  5. Тут можно преобрести купить огнестойкий сейф пожаростойкие сейфы

  6. Здесь можно преобрести сейф купить цена купить сейф

  7. raketaigra说道:

    Загрузите ракету на деньги и испытайте удачу.

  8. Robertmep说道:

    http://erepharm.com/# ED meds online

  9. DennisBob说道:

    cheapest ed pills ere pharm: ED pills non prescription – best ed pills online

  10. Lloydlania说道:

    https://rybpharm.com/# buy rybelsus online usa

  11. CurtisTraup说道:

    buy rybelsus rybpharm buy rybelsus canada rybpharm cheap semaglutide

  12. DennisBob说道:

    rybpharm canada: rybpharm canada – buy rybelsus rybpharm

  13. Robertmep说道:

    http://gabapharm.com/# buy gabapentin

  14. CurtisTraup说道:

    kampharm.shop kampharm.shop kampharm shop

  15. DennisBob说道:

    buy lasix fur pharm: furpharm – buy furosemide online

  16. Lloydlania说道:

    http://furpharm.com/# cheapest lasix

  17. CurtisTraup说道:

    buy rybelsus canada rybpharm rybelsus buy rybelsus rybpharm

  18. DennisBob说道:

    rybpharm: buy rybelsus online usa – buy rybelsus rybpharm

  19. Robertmep说道:

    http://rybpharm.com/# buy rybelsus online usa

  20. Lloydlania说道:

    https://furpharm.com/# buy lasix fur pharm

  21. Сервисный центр предлагает адреса ремонта сушильных машин bosch ремонт сушильных машин bosch недорого

  22. CurtisTraup说道:

    rybpharm cheap semaglutide rybpharm cheap semaglutide buy rybelsus

  23. Тут можно преобрести пожаростойкие сейфы сейф пожаростойкий

  24. DennisBob说道:

    buy gabapentin india: GabaPharm – cheapest Gabapentin GabaPharm

  25. Robertmep说道:

    https://erepharm.com/# best ed pill ere pharm

  26. CurtisTraup说道:

    buy lasix fur pharm furosemide fur pharm furosemide

  27. DennisBob说道:

    buy ed pills: erepharm.com – cheapest ed pills ere pharm

  28. Lloydlania说道:

    https://rybpharm.com/# buy rybelsus online usa

  29. Тут можно преобрести сейф огнестойкий купить сейф противопожарный

  30. Robertmep说道:

    https://furpharm.com/# buy lasix fur pharm

  31. CurtisTraup说道:

    kamagra buy kamagra oral jelly Kam Pharm kam pharm shop

  32. Lloydlania说道:

    http://gabapharm.com/# buy gabapentin india

  33. DennisBob说道:

    cheapest lasix: furosemide fur pharm – cheapest lasix

  34. CurtisTraup说道:

    rybpharm rybelsus rybpharm rybelsus rybpharm rybelsus

  35. DennisBob说道:

    buy gabapentin india: GabaPharm Gabapentin – cheapest Gabapentin GabaPharm

  36. CurtisTraup说道:

    buy gabapentin gabapentin buy gabapentin online

  37. Lloydlania说道:

    https://gabapharm.com/# buy gabapentin

  38. DennisBob说道:

    rybpharm: buy rybelsus – rybpharm cheap semaglutide

  39. CurtisTraup说道:

    buy rybelsus online usa semaglutide buy rybelsus

  40. profi teh remont说道:

    Сервисный центр предлагает ремонт стиральной машины de dietrich адреса срочный ремонт стиральных машин de dietrich

  41. Тут можно преобрести сейф оружейный купить москва сейф для оружия цена в москве

  42. pupis说道:

    Скачайте приложение для Android и начните делать ставки — просто установите БК и играйте

  43. DennisBob说道:

    kampharm shop: Kamagra Kam Pharm – kamagra oral jelly

  44. Lloydlania说道:

    https://erepharm.com/# best ed pill ere pharm

  45. profi teh remont说道:

    Сервисный центр предлагает ремонт бесперебойника ресанта выездной ремонт бесперебойников ресанта

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注