libpercented
Библиотека на C
для процентного кодирования и декодирования по умолчанию кодирует или декодирует весь заданный ввод, но имеется возможность задать свои правилам, такие как:
- какие байты ввода не кодировать, а выводить как есть;
- какие байты ввода не кодировать, а заменять на другие;
Это позволяет например кодировать компоненты URL адресов по заданным правилам, и/или декодировать их (или адреса целиком).
Не использует выделения памяти, работает с входным и выходным буферами, кодирует и декодирует данные целиком Можно использовать не как библиотеку, а просто расположить percented.c
и percented.h
в дереве исходников вашего проекта.
Зависимости
- Заголовки
stddef.h
C
компиляторC99
илиC11
Установка и удаление
Глобально
make
sudo make install
sudo make uninstall
Локально
make
make PREFIX=$HOME/.local install
make PREFIX=$HOME/.local uninstall
Независимо
make
make DESTDIR=$HOME/some_you_dir install
make DESTDIR=$HOME/some_you_dir uninstall
Использование
Минимальный пример кодирования
/* https://creativecommons.org/public-domain/cc0/ */
#include <stdio.h>
#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
/* prepare input */
unsigned char inp[] =
"https://example.com/file?name=фо то.jpg&name=img.png#название";
size_t inp_size = strlen(inp);
/* prepare ouput */
size_t out_size = inp_size * 3;
unsigned char out[out_size];
/* prepare variable to save data len (can ignore it and set NULL) */
size_t written = 0;
/* set data, if last parametr is NULL encode all input bytes */
int status = percented_encode(inp,inp_size,out,out_size,&written,NULL);
if(status != PERCENTED_SUCCESS)
{
fprintf(stderr,"Error: code = %d\n",status);
return status;
}
/* out_size > written size, in this case need set '\0' */
out[written] = '\0';
/* show result */
printf("data = %s size = %d\n",out, written);
return 0;
}
cc encode.c -o app libpercented.a
./app
data = %68%74%74%70%73%3A%2F%2F%65%78%61%6D%70%6C%65%2E%63%6F%6D%2F%66%69%6C%65%3F%6E%61%6D%65%3D%D1%84%D0%BE%20%D1%82%D0%BE%2E%6A%70%67%26%6E%61%6D%65%3D%69%6D%67%2E%70%6E%67%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 size = 219
Минимальный пример декодирования
/* This example code licensed as Public Domain CC0 */
/* https://creativecommons.org/public-domain/cc0/ */
#include <stdio.h>
#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
/* prepare input */
unsigned char inp[] =
"https%3A%2F%2Fexample.com%2Ffile%3Fname%3D%D1%84%D0%BE+%D1%82%D0%BE.jpg"
"%26name%3Dimg.png%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5";
size_t inp_size = strlen(inp);
/* prepare ouput */
size_t out_size = inp_size; /* or calculate own */
unsigned char out[out_size];
/* prepare variable to save data len (can ignore it and set NULL) */
size_t written = 0;
/* set data, if last parametr is NULL try just decode all */
int status = percented_decode(inp,inp_size,out,out_size,&written,NULL);
if(status != PERCENTED_SUCCESS)
{
fprintf(stderr,"Error: code = %d\n",status);
return status;
}
/*out_size > written size, in this case need set '\0' */
out[written] = '\0';
printf("data = %s size = %d\n",out, written);
return 0;
}
cc decode.c -o app libpercented.a
./app
data = https://example.com/file?name=фо+то.jpg&name=img.png#название size = 73
Пример использования кодирования по своим правилам
#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
/* create you own rule */
unsigned char ignore[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
unsigned char replace_from[] = " ";
unsigned char replace_to[] = "+";
struct percented rule;
int reg_status = percented_register(ignore,replace_from,replace_to,&rule);
if(reg_status != PERCENTED_SUCCESS)
{
fprintf(stderr,"Error: code = %c\n",reg_status);
return reg_status;
}
/* prepare input */
unsigned char inp[] =
"https://example.com/file?name=фо то.jpg&name=img.png#название";
size_t inp_size = strlen(inp);
/* prepare ouput */
size_t out_size = inp_size * 3;
unsigned char out[out_size];
/* prepare variable to save data len (can ignore it and set NULL) */
size_t written = 0;
int status = percented_encode(inp,inp_size,out,out_size,&written,&rule);
if(status != PERCENTED_SUCCESS)
{
fprintf(stderr,"Error: code = %d\n",status);
return status;
}
/*out_size > written size, in this case need set '\0' */
out[written] = '\0';
printf("data = %s size = %d\n",out, written);
return 0;
}
cc custom.c -o app libpercented.a
./app
data = https%3A%2F%2Fexample.com%2Ffile%3Fname%3D%D1%84%D0%BE+%D1%82%D0%BE.jpg%26name%3Dimg.png%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 size = 139
На заметку
Кажется всё работает правильно. Потоковый механизм кодирования и декодирования в планах.
Описание
Процентное кодирование и декодирование