Kodowanie znaków przesłane metodą GET

0

Witajcie, zacząłem pracę z c++ i natknąłem się na problem, chciałbym przesłać metodą GET identyfikator użytkownika do strony, niestety identyfikator zawiera między innymi znaki takie jak "+", który jeśli zostanie przesłany w GET zostanie zamieniony na spację w formularzu.
Kod wygląda tak:

void ts3plugin_infoData(uint64 serverConnectionHandlerID, uint64 id, enum PluginItemType type, char** data) {
	char* name;
	char* uid;


	/* For demonstration purpose, display the name of the currently selected server, channel or client. */
	switch(type) {
			break;
		case PLUGIN_CLIENT:
			if(ts3Functions.getClientVariableAsString(serverConnectionHandlerID, (anyID)id, CLIENT_NICKNAME, &name) != ERROR_ok) {
				printf("Error getting client nickname\n");
				return;
			}

			if (ts3Functions.getClientVariableAsString(serverConnectionHandlerID, (anyID)id, CLIENT_UNIQUE_IDENTIFIER, &uid) != ERROR_ok) {
				printf("Error getting client identifier\n");
				return;
			}
			break;
		default:
			printf("Invalid item type: %d\n", type);
			data = NULL;  /* Ignore */
			return;
	}

	*data = (char*)malloc(INFODATA_BUFSIZE * sizeof(char));  /* Must be allocated in the plugin! */
	snprintf(*data, INFODATA_BUFSIZE, "Client on mysite: [URL=http://mysite.com/?uid=\%s\]\"%s\"[/URL]", uid, name);
	ts3Functions.freeMemory(name);
}

Pomoże ktoś? Z góry dziękuję.

1

przeciez to nie jest C++ a C. Wiec jezeli chcesz pisac w C++ to skorzystaj np z tego https://github.com/oktal/pistache

0

A czy nie wystarczy tego identyfikatora potraktować base64?

0
fasadin napisał(a):

przeciez to nie jest C++ a C. Wiec jezeli chcesz pisac w C++ to skorzystaj np z tego https://github.com/oktal/pistache

W takim razie przepraszam. Więc potrzebuję to zrobić w C

Juhas napisał(a):

A czy nie wystarczy tego identyfikatora potraktować base64?

Niestety. Strona do której będę przesyłał dane nie należy do mnie.
Najlepiej gdyby się dało zakodować w urlencode. Szukałem po różnych stronach jak to zrobić, ale bez efektu. :/

0

Serio? Zamiana + na %2B nie działa?

0
Juhas napisał(a):

Serio? Zamiana + na %2B nie działa?

Problem w tym, że nie wiem jak to zastosować, co i gdzie wstawić.
Pomożesz?

0

Google: "c string replace"
i masz mnóstwo odpowiedzi, np:
http://stackoverflow.com/questions/779875/what-is-the-function-to-replace-string-in-c
http://stackoverflow.com/questions/32413667/replace-all-occurrences-of-a-substring-in-a-string-in-c

itd.

Przed wysłaniem musisz zmienić wszystkie wystąpienia znaku + na %2B

0

Na spokojnie gdzie ten + wchodzi i gdzie jest przesyłany. Albo wklej dokłądnie ramkę/header którą przesyłasz.
Thx.

0
wujnia napisał(a):

Na spokojnie gdzie ten + wchodzi i gdzie jest przesyłany. Albo wklej dokłądnie ramkę/header którą przesyłasz.
Thx.

Identyfikator jest przesyłany w zmiennej "uid"

snprintf(*data, INFODATA_BUFSIZE, "Client on mysite: [URL=http://mysite.com/?uid=\%s\]\"%s\"[/URL]", uid, name);

Aktualnie przykładowy identyfikator wygląda tak "xRx/++Bz+8dKdC4LOvccsymkiIqxY="

0

znajdź w necie decode/encode url i skodowane przeslij, spr czy działa.

http://meyerweb.com/eric/tools/dencoder/

0
wujnia napisał(a):

znajdź w necie decode/encode url i skodowane przeslij, spr czy działa.

http://meyerweb.com/eric/tools/dencoder/

Identyfikator przed encode: xRx/++Bz8dKdC4LOvQsymkiIqxY=
Identyfikator po encode: xRx%2F%2B%2BBz8dKdC4LOvQsymkiIqxY%3D

Skorzystałem z http://meyerweb.com/eric/tools/dencoder/

Strona prawidłowo odczytuje zakodowany identyfikator.

Tylko jak zakodować ten identyfikator w tym kodzie, co podałem w pierwszym poście?

0

na ideone printf( "linijka" );
i sprawdzasz gdzie się jebie wszelkie \ dwa razy i % podwajasz na %%.
Aż będzie działało.

Coś w tym stylu https://ideone.com/3bPseE

0
wujnia napisał(a):

na ideone printf( "linijka" );
i sprawdzasz gdzie się jebie wszelkie \ dwa razy i % podwajasz na %%.
Aż będzie działało.

Coś w tym stylu https://ideone.com/3bPseE

Nie bardzo rozumiem o co chodzi w tym, co napisałeś.
Bo ogólnie mam problem taki, że w zmiennej "uid" jest identyfikator użytkownika, który zawiera znaki np. takie jak "+".

snprintf(*data, INFODATA_BUFSIZE, "Client on mysite: [URL=http://mysite.com/?uid=\%s\]\"%s\"[/URL]", uid, name);

Powyższy kod tworzy link dla użytkownika, który wygląda po przesłaniu do użytkownika następująco:

 http://mysite.com/?uid=aGdyAuvyE++apzSsS++bHDwGLyCo=

Gdy użytkownik kliknie w link formularz na stronie niepoprawnie pobierze GET, bo domyślnie "+" są zamieniane na spacje.
Chodzi mi o to, by kod generował użytkownikowi link już ze zamienionymi "+" na "%2B"

0

Jak to będzie zamieniane/wysyłąne to już musisz sam pokombinować. Nie dam gotowych rozwiązań ;)

Wydaje mi się, że z tym urlencode popchnąłem Cie mimo wszystko w dobrym kierunku.

Pozdrawiam.

0
wujnia napisał(a):

Jak to będzie zamieniane/wysyłąne to już musisz sam pokombinować. Nie dam gotowych rozwiązań ;)

Wydaje mi się, że z tym urlencode popchnąłem Cie mimo wszystko w dobrym kierunku.

Pozdrawiam.

Z urlencode ja już od rana sam kombinuje, ale jakoś mi nie idzie. W PHP z tym, co chcę osiągnąć nie miałbym problemów, a z tym C mam, dziś po raz pierwszy zacząłem coś w tym języku robić.

0

znalazłem przykład na tej http://www.binarytides.com/str_replace-for-c/ stronie i zrobiłem tak:

void ts3plugin_infoData(uint64 serverConnectionHandlerID, uint64 id, enum PluginItemType type, char** data) {
	char* name;
	char* uid;

	/* For demonstration purpose, display the name of the currently selected server, channel or client. */
	switch(type) {
			break;
		case PLUGIN_CLIENT:
			if(ts3Functions.getClientVariableAsString(serverConnectionHandlerID, (anyID)id, CLIENT_NICKNAME, &name) != ERROR_ok) {
				printf("Error getting client nickname\n");
				return;
			}

			if (ts3Functions.getClientVariableAsString(serverConnectionHandlerID, (anyID)id, CLIENT_UNIQUE_IDENTIFIER, &uid) != ERROR_ok) {
				printf("Error getting client identifier\n");
				return;
			}
			break;
		default:
			printf("Invalid item type: %d\n", type);
			data = NULL;  /* Ignore */
			return;
	}

	char *c = str_replace("+", "%%2B", uid);

	*data = (char*)malloc(INFODATA_BUFSIZE * sizeof(char));
	snprintf(*data, INFODATA_BUFSIZE, "Client on mysite: [URL=http://mysite.com/?uid=\%s\]\"%s\"[/URL]", c, name);
	ts3Functions.freeMemory(name);
	ts3Functions.freeMemory(uid);
}

Ale mam błąd przy kompilacji:
plugin.obj : error LNK2019: nierozpoznany zewnętrzny symbol _str_replace przywołany w funkcji _ts3plugin_infoData

0

Boże, człowieku przecież dałem Ci gotowe rozwiązanie, czego nie ogarniasz?

0

Problem rozwiązałem już wczoraj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1