Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
urldecode.c
Go to the documentation of this file.
1
/*
2
* Simple URL decoding function
3
* Copyright (c) 2012 Antti Seppälä
4
*
5
* References:
6
* RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
7
* T. Berners-Lee et al. The Internet Society, 2005
8
*
9
* based on http://www.icosaedro.it/apache/urldecode.c
10
* from Umberto Salsi (salsi@icosaedro.it)
11
*
12
* This file is part of Libav.
13
*
14
* Libav is free software; you can redistribute it and/or
15
* modify it under the terms of the GNU Lesser General Public
16
* License as published by the Free Software Foundation; either
17
* version 2.1 of the License, or (at your option) any later version.
18
*
19
* Libav is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22
* Lesser General Public License for more details.
23
*
24
* You should have received a copy of the GNU Lesser General Public
25
* License along with Libav; if not, write to the Free Software
26
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27
*/
28
29
#include <ctype.h>
30
#include <string.h>
31
32
#include "
libavutil/mem.h
"
33
#include "
libavutil/avstring.h
"
34
#include "
urldecode.h
"
35
36
char
*
ff_urldecode
(
const
char
*url)
37
{
38
int
s = 0, d = 0, url_len = 0;
39
char
c;
40
char
*dest =
NULL
;
41
42
if
(!url)
43
return
NULL
;
44
45
url_len = strlen(url) + 1;
46
dest =
av_malloc
(url_len);
47
48
if
(!dest)
49
return
NULL
;
50
51
while
(s < url_len) {
52
c = url[s++];
53
54
if
(c ==
'%'
&& s + 2 < url_len) {
55
char
c2
= url[s++];
56
char
c3
= url[s++];
57
if
(isxdigit(c2) && isxdigit(c3)) {
58
c2 =
av_tolower
(c2);
59
c3 =
av_tolower
(c3);
60
61
if
(c2 <=
'9'
)
62
c2 = c2 -
'0'
;
63
else
64
c2 = c2 -
'a'
+ 10;
65
66
if
(c3 <=
'9'
)
67
c3 = c3 -
'0'
;
68
else
69
c3 = c3 -
'a'
+ 10;
70
71
dest[d++] = 16 * c2 +
c3
;
72
73
}
else
{
/* %zz or something other invalid */
74
dest[d++] = c;
75
dest[d++] =
c2
;
76
dest[d++] =
c3
;
77
}
78
}
else
if
(c ==
'+'
) {
79
dest[d++] =
' '
;
80
}
else
{
81
dest[d++] = c;
82
}
83
84
}
85
86
return
dest;
87
}