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

/ 4,087评论 / 17421阅读 / 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. Тут можно преобрести сейфов для оружия сейф сейфы оружейный оружие

  2. Узнай все о двустороннее варикоцеле варикоцеле слева у мужчин

  3. Brandenven说道:

    amoxicillin buy canada: Com Pharm – order amoxicillin online uk

  4. DanielArill说道:

    amoxicillin buy canada https://clomidrexpharm.com/# where can i get generic clomid without prescription

  5. StevenWearo说道:

    prednisone 5 mg tablet rx: buy prednisone – 10mg prednisone daily

  6. Derekjup说道:

    buy priligy: buy priligy max pharm – buy priligy max pharm

  7. Derekjup说道:

    how to buy amoxicillin online: amoxil com pharm – ampicillin amoxicillin

  8. DanielArill说道:

    amoxicillin 500mg tablets price in india https://priligymaxpharm.com/# cheap priligy

  9. StevenWearo说道:

    cost of clomid online: generic clomid – where to buy cheap clomid without insurance

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

  11. Brandenven说道:

    priligy: cheap priligy – dapoxetine online

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

  13. Brandenven说道:

    buy generic clomid: clomid – cost generic clomid without insurance

  14. Bradleyarrip说道:

    can i order generic clomid clomid can i order generic clomid without dr prescription

  15. StevenWearo说道:

    how to get amoxicillin over the counter: Com Pharm – amoxicillin 500 mg

  16. DanielArill说道:

    where to buy amoxicillin pharmacy http://amoxilcompharm.com/# how to get amoxicillin

  17. Узнай все о варикоцеле 2 степени признаки варикоцеле

  18. Узнай все о клиника варикоцеле варикоцеле диагностика

  19. Bradleyarrip说道:

    buy 40 mg prednisone raypharm average cost of generic prednisone

  20. DanielArill说道:

    amoxil generic https://prednisoneraypharm.com/# can i order prednisone

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

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

  23. StevenWearo说道:

    can you buy cheap clomid no prescription: rex pharm – how to get clomid

  24. descargar1xslots说道:

    Con 1xslot app tendras acceso a los mejores juegos y promociones.

  25. Derekjup说道:

    medicine amoxicillin 500mg: cheap amoxil – amoxicillin 500mg prescription

  26. Derekjup说道:

    amoxicillin buy no prescription: buy amoxil online – amoxicillin order online no prescription

  27. Brandenven说道:

    prednisone buy canada: prednisone – prednisone buying

  28. DanielArill说道:

    buy cheap amoxicillin online http://prednisoneraypharm.com/# otc prednisone cream

  29. Bradleyarrip说道:

    prednisone 5093 cheap prednisone generic prednisone for sale

  30. Brandenven说道:

    can i purchase generic clomid pill: generic clomid – how can i get clomid tablets

  31. StevenWearo说道:

    can i get cheap clomid without prescription: cheap clomid – can you buy clomid without prescription

  32. DanielArill说道:

    amoxicillin script https://clomidrexpharm.com/# can i get cheap clomid prices

  33. Bradleyarrip说道:

    generic amoxicillin Amoxicillin Com Pharm generic amoxicillin

  34. StevenWearo说道:

    cheap clomid no prescription: clomid rex pharm – how can i get clomid no prescription

  35. DanielArill说道:

    where can i buy amoxicillin online http://priligymaxpharm.com/# priligy maxpharm

  36. The Aviator game is a favorite among Indian players for its real-time betting and intense strategy. Choose to play for real money or try the demo mode to learn the mechanics risk-free. It’s all about when you pull the trigger!

    aviator money game online aviator game .

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

  38. ShaunLolve说道:

    ed pills that work quickly https://canadiandrugsgate.com/# best ed pills online
    comfortis without vet prescription

  39. Bradleyarrip说道:

    http://indianpharmacyeasy.com/# top online pharmacy india

  40. Jefferyswava说道:

    best online drugstore: Canadian pharmacy online – how to treat ed

  41. Jefferyswava说道:

    purple pharmacy mexico price list: medicines mexico rx online – purple pharmacy mexico price list

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

  43. LarryHer说道:

    indianpharmacy com: Best online Indian pharmacy – cheapest online pharmacy india

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

  45. Тут можно преобрести оружейный сейф интернет магазин сейф для оружия купить

  46. GlennSeade说道:

    cheap pet meds without vet prescription canadian pharmacy ed pills otc

发表回复

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