parent
897cc85f52
commit
e45ab8bf31
@ -0,0 +1,58 @@
|
||||
#include "escape.h"
|
||||
|
||||
#include <strings.h>
|
||||
|
||||
const char* http_escape( const char* str, char* out, unsigned int limit, const char* allowed )
|
||||
{
|
||||
const char* result = out;
|
||||
|
||||
// Based on RFC 3986 Uniform Resource Identifier (URI): Generic Syntax
|
||||
for(; *str; ++str ) {
|
||||
switch( *str ) {
|
||||
// Reserved characters (sometimes encoded)
|
||||
case ':':
|
||||
case '/':
|
||||
case '?':
|
||||
case '#':
|
||||
case '@':
|
||||
case '[':
|
||||
case ']':
|
||||
case '+':
|
||||
case ',':
|
||||
case '(':
|
||||
case ')':
|
||||
case '!':
|
||||
case '*':
|
||||
if( !index(allowed, *str) ) {
|
||||
goto escape;
|
||||
}
|
||||
// Unreserved characters (Never encoded)
|
||||
case 'a' ... 'z':
|
||||
case 'A' ... 'Z':
|
||||
case '0' ... '9':
|
||||
case '~':
|
||||
case '.':
|
||||
case '-':
|
||||
case '_':
|
||||
*out = *str;
|
||||
if( limit ) { --limit; ++out; }
|
||||
break;
|
||||
default:
|
||||
{
|
||||
escape:
|
||||
*out = '%';
|
||||
if( limit ) { --limit; ++out; }
|
||||
|
||||
*out = "0123456789ABCDEF"[ (*str >> 4) % 16 ];
|
||||
if( limit ) { --limit; ++out; }
|
||||
|
||||
*out = "0123456789ABCDEF"[ (*str >> 0) % 16 ];
|
||||
if( limit ) { --limit; ++out; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*out = '\0';
|
||||
|
||||
return result;
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
const char* http_escape( const char* str, char* out, unsigned int limit, const char* allowed );
|
||||
|
Loading…
Reference in new issue