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

/ 4,882评论 / 20120阅读 / 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. KennethCex说道:

    no prescription prednisone canadian pharmacy prednisone brand name canada prednisone over the counter uk

  2. Тут можно преобрести cейфы взломостойкие взломостойкие сейфы купить

  3. Ronaldgroxy说道:

    дивитися фільм онлайн якості 2024 дивитися кіно онлайн

  4. GeorgeAbach说道:

    фільми онлайн у високій якості 2024 дивитися фільм

  5. onexbet_gjsa说道:

    Самый популярный букмекер onexbet, заходите и выигрывайте онлайн|Успешные ставки на спорт с onexbet, большие деньги ждут вас|Безопасные ставки с onexbet, играйте честно и безопасно|Приятные сюрпризы от onexbet, получите дополнительные ставки бесплатно|Играйте в казино онлайн на onexbet, выигрывайте крупные суммы в удобном формате|Беспрецедентный уровень обслуживания на onexbet, важны ваш комфорт и удобство|Законные ставки на onexbet, не нарушайте правила и несите ответственность|Не упустите шанс следить за любимыми матчами, выигрывайте, не выходя из дома|Получайте эксклюзивные предложения от onexbet, бонусы и подарки ждут вас|Азартные игры с живыми дилерами на onexbet, новый уровень азарта в онлайн казино|Следите за результатами на onexbet, получайте прибыль от своих прогнозов|Делайте выгодные прогнозы и зарабатывайте, выигрывайте больше и чаще|Лучшие коэффициенты и выигрыши на onexbet, делайте ставки с выгодой и уверенностью|Онлайн поддержка пользователей на onexbet, не оставляйте вопросов без ответа|Легкость использования и простота на onexbet, новый уровень игрового опыта|Играйте и выигрывайте крупные суммы, ваша удача ждет вас в онлайн казино|Получайте прибыль от своих прогнозов, новый уровень заработка|Персональный коэффициент успеха на onexbet, ваш выигрыш – наша главная задача|Ставьте и зарабатывайте вместе с нами, делайте прогнозы и получайте прибыль|Профессиональная букмекерская контора onex
    download one x bet apk https://arxbetdslps.com/ .

  6. RobertInpup说道:

    get cheap clomid online: clomidonpharm – can you get cheap clomid without prescription

  7. KennethCex说道:

    cipro ciprofloxacin ci pharm delivery where to buy cipro online

  8. Danielplent说道:

    https://prednibest.com/# prednisone 20mg online without prescription

  9. RobertInpup说道:

    where buy clomid pills: can you buy cheap clomid no prescription – can i get generic clomid prices

  10. Здесь можно сейфы для дома сейф домашний цена

  11. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов honor в москве, можете посмотреть на сайте: ремонт телефонов honor
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  12. SamuelDarse说道:

    buy amoxicillin 500mg online: AmoxStar – generic amoxicillin cost

  13. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов infinix цены, можете посмотреть на сайте: ремонт телефонов infinix цены
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  14. Здесь можно домашний сейф купить сейф домой

  15. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов honor рядом, можете посмотреть на сайте: ремонт телефонов honor
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  16. SamuelDarse说道:

    can i buy prednisone online without a prescription: prednisone cream rx – prednisone 20 mg tablets

  17. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов infinix рядом, можете посмотреть на сайте: ремонт телефонов infinix адреса
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  18. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов honor сервис, можете посмотреть на сайте: ремонт телефонов honor
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  19. Предлагаем услуги профессиональных инженеров офицальной мастерской.
    Еслли вы искали ремонт телефонов honor, можете посмотреть на сайте: ремонт телефонов honor
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

发表回复

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