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

/ 4,117评论 / 17517阅读 / 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. Istanbul_dqea说道:

    Основные моменты Istanbul International Airport, как все начиналось и что из этого вышло.
    Интересные факты о Istanbul International Airport, о которых мало кто слышал.
    Уникальная архитектура Istanbul International Airport, которые вызывают восхищение.
    Будущее Istanbul International Airport, новые горизонты и возможности.
    Сервисы и удобства Istanbul International Airport, что сделано для комфорта путешественников.
    new airport in istanbul new airport in istanbul .

  2. RobertObefe说道:

    Visit store: paxlovid store – see a healthcare provider

  3. WilliamTub说道:

    Care provides: compare the best prices – Neurontin online

  4. TommyJew说道:

    Rybelsus: Urgent Specialists – Rybelsus

  5. WilliamTub说道:

    semaglutide: semaglutide – Regenerative Medicine

  6. Russellwar说道:

    https://paxlovid1st.store/# see a healthcare provider

  7. TommyJew说道:

    gabapentin best price: gabapentin pro – same-day delivery

  8. RobertObefe说道:

    stromectol: good price – good price

  9. WilliamTub说道:

    Neurontin online: Neurontin online – Care provides

  10. TommyJew说道:

    cheapest: stromectol online – stromectol

  11. WilliamTub说道:

    good price: stromectol delivery usa – cheapest

  12. Russellwar说道:

    http://gabapentin1st.pro/# compare the best prices

  13. profi teh remont说道:

    Сервисный центр предлагает срочный ремонт телевизоров polarline стоимость ремонта телевизора polarline

  14. TommyJew说道:

    Care provides: compare the best prices – same-day delivery

  15. RobertObefe说道:

    amoxil 1st shop: buy amoxil online – amoxil price

  16. WilliamTub说道:

    cheapest: stromectol store – find bets price

  17. Russellwar说道:

    https://paxlovid1st.store/# cheapest paxlovid

  18. TommyJew说道:

    amoxil price: amoxil price – amoxil 1st shop

  19. Сервисный центр предлагает ремонт сервера acer недорого отремонтировать сервера acer

  20. WilliamTub说道:

    same-day delivery: licensed gabapentin – gabapentin best price

  21. RobertObefe说道:

    Care provides: gabapentin best price – involves multisystem

  22. TommyJew说道:

    see a healthcare provider: Pills Paxlovid – Visit store

  23. WilliamTub说道:

    stromectol store: stromectol store – stromectol best price

  24. WilliamTub说道:

    paxlovid store: paxlovid1st – see a healthcare provider

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

  26. JefferyTriep说道:

    sweetbonanzatr.pro: sweetbonanzatrpro – sweet bonanza

  27. DerekZeple说道:

    http://sweetbonanzatr.pro/# sweet bonanza
    pin up casino

  28. HarryMaigh说道:

    пин ап вход pinco пинап казино

  29. MichaelKeype说道:

    http://pinupzerkalo.fun/# Пин Ап Казино Официальный Сайт в России

  30. JasonLot说道:

    Пин Ап Казахстан: пинап – пин ап казино

  31. JefferyTriep说道:

    sweet bonanza oyna: sweet bonanza – sweet bonanza tr

  32. JasonLot说道:

    sweet bonanza tr: sweet bonanza – sweetbonanzatrpro

  33. JefferyTriep说道:

    pinup az: pin-up casino giris – pin up casino

  34. DerekZeple说道:

    https://sweetbonanzatr.pro/# sweet bonanza oyna
    pin up casino

  35. profi-teh-remont说道:

    Сервисный центр предлагает ремонт lenovo a7000 в петербурге ремонт lenovo a7000 цены

  36. JefferyTriep说道:

    pinup az: pinup az – pin-up casino giris

  37. HarryMaigh说道:

    pinco пин ап казино пинап казино

  38. JefferyTriep说道:

    pin up casino: pin up casino – pin up azerbaycan

  39. DerekZeple说道:

    https://pinup-az.bid/# pin up 306
    pin up win

  40. JasonLot说道:

    sweet bonanza: sweetbonanzatr.pro – sweet bonanza oyna

  41. profi-teh-remont说道:

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

  42. JasonLot说道:

    sweet bonanza nas?l oynan?r: sweet bonanza – sweet bonanza oyna

发表回复

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