summaryrefslogtreecommitdiff
path: root/icespider/core/xwwwFormUrlEncoded.h
blob: 6c266b64767aaf3a2a9dfeed6de7fd37e1fb2489 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef ICESPIDER_CGI_XWWWFORMURLENCODED_H
#define ICESPIDER_CGI_XWWWFORMURLENCODED_H

#include <boost/algorithm/string/split.hpp>
#include <maybeString.h>
#include <slicer/serializer.h>
#include <visibility.h>

namespace IceSpider {
	class XWwwFormUrlEncoded : public Slicer::Deserializer {
	public:
		using KVh = std::function<void(MaybeString &&, MaybeString &&)>;

		explicit XWwwFormUrlEncoded(std::istream & in);

		void Deserialize(Slicer::ModelPartForRootPtr mp) override;
		DLL_PUBLIC static void iterateVars(
				const std::string_view & input, const KVh & h, const std::string_view & split);

		DLL_PUBLIC static MaybeString urldecode(std::string_view::const_iterator s, std::string_view::const_iterator);
		DLL_PUBLIC static std::string urlencode(std::string_view::const_iterator s, std::string_view::const_iterator);
		DLL_PUBLIC static void urlencodeto(
				std::ostream &, std::string_view::const_iterator s, std::string_view::const_iterator);
		DLL_PUBLIC static std::string urlencode(const std::string_view & s);

	private:
		static inline void iterateVars(
				const KVh & h, boost::algorithm::split_iterator<std::string_view::const_iterator> pi);

		void iterateVars(const KVh & h);

		void DeserializeSimple(const Slicer::ModelPartPtr & mp);
		void DeserializeComplex(const Slicer::ModelPartPtr & mp);
		void DeserializeDictionary(const Slicer::ModelPartPtr & mp);

		const std::string input;
	};

};

#endif