ATLAS Offline Software
Loading...
Searching...
No Matches
urldecode Namespace Reference

Classes

struct  decoder_state_s

Typedefs

typedef struct urldecode::decoder_state_s decoder_state

Enumerations

enum  states { ST_SYM , ST_PERCENT , ST_PERCENT_AND_SYM }

Functions

static int hexdigit (char c)
int is_unreserved (char c)
ssize_t urldecode (decoder_state *state, char *data, size_t size)
 Decodes URL-encoded data.
std::pair< std::string, int > urldecode (decoder_state *state, const std::string &data, size_t size)

Typedef Documentation

◆ decoder_state

Enumeration Type Documentation

◆ states

Enumerator
ST_SYM 
ST_PERCENT 
ST_PERCENT_AND_SYM 

Definition at line 39 of file urldecode.h.

Function Documentation

◆ hexdigit()

int urldecode::hexdigit ( char c)
static

Definition at line 28 of file urldecode.h.

29{
30 if (c >= '0' && c <= '9')
31 return c - '0';
32 if (c >= 'A' && c <= 'F')
33 return 10 + c - 'A';
34 if (c >= 'a' && c <= 'f')
35 return 10 + c - 'a';
36 return -1;
37}

◆ is_unreserved()

int urldecode::is_unreserved ( char c)

Definition at line 47 of file urldecode.h.

48{
49 return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
50 (c >= '0' && c <= '9') || index("-_.~!*'();:@&=+$,/?%#[]", c);
51}
Definition index.py:1

◆ urldecode() [1/2]

ssize_t urldecode::urldecode ( decoder_state * state,
char * data,
size_t size )

Decodes URL-encoded data.

Because encoded data is always bigger conversion is done in-place.

Returns
Number of decoded bytes written to data. Negative integer if data is not valid URL-encoded sequence.

Definition at line 59 of file urldecode.h.

60{
61 size_t inpos = 0, outpos = 0;
62 int d1, d2;
63 while (inpos < size)
64 {
65 char in = data[inpos++];
66 switch (in)
67 {
68 case '%':
69 switch (state->state)
70 {
71 case ST_SYM:
72 state->state = ST_PERCENT;
73 break;
74 default:
75 return -1;
76 }
77 break;
78 case '+':
79 switch (state->state)
80 {
81 case ST_SYM:
82 data[outpos++] = ' ';
83 break;
84 default:
85 return -1;
86 }
87 break;
88 default:
89 switch (state->state)
90 {
92 d1 = hexdigit(state->sym), d2 = hexdigit(in);
93 if (d1 >= 0 && d2 >= 0)
94 {
95 data[outpos++] = (d1 << 4) | d2;
96 }
97 else
98 {
99 return -1;
100 }
101 state->state = ST_SYM;
102 break;
103 case ST_PERCENT:
104 state->sym = in;
105 state->state = ST_PERCENT_AND_SYM;
106 break;
107 case ST_SYM:
108 if (is_unreserved(in))
109 {
110 data[outpos++] = in;
111 }
112 else
113 {
114 return -1;
115 }
116 break;
117 }
118 }
119 }
120 return outpos;
121}
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
int is_unreserved(char c)
Definition urldecode.h:47
static int hexdigit(char c)
Definition urldecode.h:28

◆ urldecode() [2/2]

std::pair< std::string, int > urldecode::urldecode ( decoder_state * state,
const std::string & data,
size_t size )

Definition at line 124 of file urldecode.h.

125{
126 size_t inpos = 0;
127 int outpos = 0;
128 int d1, d2;
129 std::stringstream output;
130 while (inpos < size)
131 {
132 char in = data[inpos++];
133 switch (in)
134 {
135 case '%':
136 switch (state->state)
137 {
138 case ST_SYM:
139 state->state = ST_PERCENT;
140 break;
141 default:
142 outpos=-1;
143 }
144 break;
145 case '+':
146 switch (state->state)
147 {
148 case ST_SYM:
149 //data[outpos++] = ' ';
150 output << ' ';
151 break;
152 default:
153 outpos=-1;
154 }
155 break;
156 default:
157 switch (state->state)
158 {
160 d1 = hexdigit(state->sym), d2 = hexdigit(in);
161 if (d1 >= 0 && d2 >= 0)
162 {
163 //data[outpos++] = (d1 << 4) | d2;
164 char temp = (d1 << 4) | d2;
165 output << temp;
166 }
167 else
168 {
169 outpos=-1;
170 }
171 state->state = ST_SYM;
172 break;
173 case ST_PERCENT:
174 state->sym = in;
175 state->state = ST_PERCENT_AND_SYM;
176 break;
177 case ST_SYM:
178 if (is_unreserved(in))
179 {
180 //data[outpos++] = in;
181 output << in;
182 }
183 else
184 {
185 outpos=-1;
186 }
187 break;
188 }
189 }
190 }
191 return std::make_pair(output.str(),outpos);
192}
output
Definition merge.py:16