Mercurial > hg > orthanc
annotate Core/HttpServer/HttpHandler.cpp @ 934:6790fdcc27e7
notes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 24 Jun 2014 17:04:27 +0200 |
parents | a811bdf8b8eb |
children | dcb2469f00f4 |
rev | line source |
---|---|
0 | 1 /** |
59 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
689 | 3 * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, |
0 | 4 * Belgium |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
136 | 10 * |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
0 | 22 * |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
33 #include "../PrecompiledHeaders.h" |
0 | 34 #include "HttpHandler.h" |
35 | |
36 #include <string.h> | |
37 | |
59 | 38 namespace Orthanc |
0 | 39 { |
40 static void SplitGETNameValue(HttpHandler::Arguments& result, | |
41 const char* start, | |
42 const char* end) | |
43 { | |
334 | 44 std::string name, value; |
45 | |
0 | 46 const char* equal = strchr(start, '='); |
47 if (equal == NULL || equal >= end) | |
48 { | |
334 | 49 name = std::string(start, end - start); |
50 //value = ""; | |
0 | 51 } |
52 else | |
53 { | |
334 | 54 name = std::string(start, equal - start); |
55 value = std::string(equal + 1, end); | |
0 | 56 } |
334 | 57 |
336 | 58 Toolbox::UrlDecode(name); |
59 Toolbox::UrlDecode(value); | |
60 | |
334 | 61 result.insert(std::make_pair(name, value)); |
0 | 62 } |
63 | |
64 | |
65 void HttpHandler::ParseGetQuery(HttpHandler::Arguments& result, const char* query) | |
66 { | |
67 const char* pos = query; | |
68 | |
69 while (pos != NULL) | |
70 { | |
71 const char* ampersand = strchr(pos, '&'); | |
72 if (ampersand) | |
73 { | |
74 SplitGETNameValue(result, pos, ampersand); | |
75 pos = ampersand + 1; | |
76 } | |
77 else | |
78 { | |
79 // No more ampersand, this is the last argument | |
80 SplitGETNameValue(result, pos, pos + strlen(pos)); | |
81 pos = NULL; | |
82 } | |
83 } | |
84 } | |
85 | |
86 | |
87 | |
207 | 88 std::string HttpHandler::GetArgument(const Arguments& getArguments, |
0 | 89 const std::string& name, |
90 const std::string& defaultValue) | |
91 { | |
207 | 92 Arguments::const_iterator it = getArguments.find(name); |
93 if (it == getArguments.end()) | |
0 | 94 { |
95 return defaultValue; | |
96 } | |
97 else | |
98 { | |
99 return it->second; | |
100 } | |
101 } | |
330 | 102 |
103 | |
104 | |
105 void HttpHandler::ParseCookies(HttpHandler::Arguments& result, | |
106 const HttpHandler::Arguments& httpHeaders) | |
107 { | |
108 result.clear(); | |
109 | |
332 | 110 HttpHandler::Arguments::const_iterator it = httpHeaders.find("cookie"); |
330 | 111 if (it != httpHeaders.end()) |
112 { | |
113 const std::string& cookies = it->second; | |
114 | |
115 size_t pos = 0; | |
116 while (pos != std::string::npos) | |
117 { | |
118 size_t nextSemicolon = cookies.find(";", pos); | |
119 std::string cookie; | |
120 | |
121 if (nextSemicolon == std::string::npos) | |
122 { | |
123 cookie = cookies.substr(pos); | |
124 pos = std::string::npos; | |
125 } | |
126 else | |
127 { | |
128 cookie = cookies.substr(pos, nextSemicolon - pos); | |
129 pos = nextSemicolon + 1; | |
130 } | |
131 | |
132 size_t equal = cookie.find("="); | |
133 if (equal != std::string::npos) | |
134 { | |
135 std::string name = Toolbox::StripSpaces(cookie.substr(0, equal)); | |
136 std::string value = Toolbox::StripSpaces(cookie.substr(equal + 1)); | |
137 result[name] = value; | |
138 } | |
139 } | |
140 } | |
141 } | |
0 | 142 } |