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

/ 405评论 / 3723阅读 / 10点赞

预备知识

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. ladesbet 同性愛者のポルノ ladestinemi.KcQLthvxH82

  2. ladesbet ਕਾਰਟੂਨ ਪੋਰਨੋਗ੍ਰਾਫੀ ladesinemi.0flTwFlmlAj

  3. criminal说道:

    Amazing! I just read your article and I’m blown away. Your perspective on this topic is incredibly insightful. I’ve gained a new perspective and can’t wait to see your next post. Thanks for sharing!

  4. lose money说道:

    Incredible! I just finished reading your post and I’m absolutely amazed. Your insight on the topic is incredibly insightful. It really made me think and am eager to read more. Thanks for sharing!

  5. scam说道:

    lost money

  6. scam说道:

    Wow! I recently read your article and I’m absolutely amazed. Your analysis on this subject is extremely valuable. It really made me think and am eager to read more. Keep up the great work!

  7. criminal说道:

    Amazing! I recently read your blog post and I’m blown away. Your perspective on this subject is spot-on. I’ve gained a new perspective and am eager to see your next post. Your work is inspiring!

  8. scam说道:

    Wow! I just finished reading your article and I’m absolutely amazed. Your perspective on this subject is extremely valuable. It really made me think and am eager to see your next post. Keep up the great work!

  9. lose money说道:

    Wow! I just finished reading your post and I’m blown away. Your analysis on the topic is extremely valuable. I’ve gained a new perspective and can’t wait to see your next post. Your work is inspiring!

  10. ਮਿਸ਼ਰਤ ਪੋਰਨ madisonivysex.RzWjUTOz4Lk

  11. मजेदार सेक्स पोर्न hkyonet.f3dOArm515i

  12. scam说道:

    Amazing! I just finished reading your blog post and I’m absolutely amazed. Your insight on this topic is spot-on. I’ve learned so much and am eager to see what you write next. Keep up the great work!

  13. phising说道:

    nice content!nice history!! boba 😀

  14. phising说道:

    nice content!nice history!! boba 😀

  15. scam说道:

    Wow! I just read your post and I’m absolutely amazed. Your perspective on this topic is incredibly insightful. I’ve learned so much and can’t wait to read more. Thanks for sharing!

  16. श्वेत-श्याम अश्लीलता txechdyzxca.Gh9l1Wc17sE

  17. phising说道:

    nice content!nice history!! boba 😀

  18. बड़का गधा पोर्न के बा hjkvbasdfzxzz.uKs48pOPzqb

  19. scam说道:

    wow, amazing

  20. नकली टैक्सी अश्लील qqyyooppxx.zPf3HbATCG4

  21. phising说道:

    nice content!nice history!! boba 😀

  22. falbobrospizzamadison DP porn jkkıjxxx.XGfJdxgusFK

  23. landuse Asian porn lancdcuse.X8X3sfpahLZ

  24. scam说道:

    nice content!nice history!! boba 😀

  25. jenniferroy ポルノのキャスティング japanesexxporns.07U47upCBRC

  26. ladyandtherose Hentai, Anime porn backlinkseox.T3COyWFwn4O

  27. goodhere Gays porn vurucutewet.49jIeCaNxdN

  28. fashionflag porn hd you fashionflag.Nmfyas42FR9

  29. SCAM说道:

    nice content!nice history!! boba 😀

  30. SCAM说道:

    nice content!nice history!! boba 😀

  31. SCAM说道:

    wow, amazing

  32. LOSE MONEY说道:

    nice content!nice history!! boba 😀

  33. lose money说道:

    Impressive, fantastic

  34. LOSE MONEY说道:

    nice content!nice history!! boba 😀

发表回复

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