summaryrefslogtreecommitdiff
path: root/icespider/core/xwwwFormUrlEncoded.h
blob: 4f6cdaedfe8e07f06341a86582eb7e6387d92fea (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
#ifndef ICESPIDER_CGI_XWWWFORMURLENCODED_H
#define ICESPIDER_CGI_XWWWFORMURLENCODED_H

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

namespace IceSpider {
	class XWwwFormUrlEncoded : public Slicer::Deserializer {
		public:
			typedef boost::function<void(const std::string &, const std::string &)> KVh;

			XWwwFormUrlEncoded(std::istream & in);

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

			DLL_PUBLIC static std::string urldecode(std::string::const_iterator s, std::string::const_iterator);
			DLL_PUBLIC static std::string urlencode(std::string::const_iterator s, std::string::const_iterator);
			DLL_PUBLIC static std::string urlencode(const std::string & s);

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

			void iterateVars(const KVh & h);

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

			const std::string input;
	};

};

#endif