Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
ngx_encode_base64url
- To: nginx-ru@xxxxxxxxx
- Subject: ngx_encode_base64url
- From: "theromis1" <nginx-forum@xxxxxxxx>
- Date: Tue, 21 Aug 2012 14:50:14 -0400 (EDT)
- Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tigger.jlkhosting.com; s=x; h=From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To:Date; bh=bkVJlDP7GLjLSVM/S4dC8Vo1EsXBlQ9JQYto1lFHyOM=; b=KDhcsHwVY47LrrQoMTcX/6er7kfstHvQj1yqtd3Ak8jkyjq9UETbEG6n49r5dnWh7irMOLmZ2nn1CXbxmqPX3ubUSdiop1VBwTsOo7rCuQKfLoDGs3skuT8Oi9FKZWqm;
Вопрос предложение навеяное java (
http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html#Base64(int,
byte[], boolean) )
Есть логика которая добавляет заголовок который потом переходит как часть
урла (с помощью rewrite rules "rewrite ^ http://blah/qwe=$http_my_header;"),
соответственно в нем бинарные данные которые base64 а потом на него делается
urlescape, но поскольку помнится можно делать эти действия urlsafe то можно
все это было бы делать без ескейпинга, тоесть за один проход base64_encode.
Соответственно можно было бы добавить функцию в ngx_string.c которая делала
бы это все безболезненно. Что кто может сказать по данному вопросу? у меня
нарисовался даже вот такой патч, но это только в первом приближении.
--- ngx_string.c.bak 2012-08-21 11:18:22.342532943 -0700
+++ ngx_string.c 2012-08-21 11:39:36.899480335 -0700
@@ -1057,13 +1057,11 @@
}
-void
-ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)
+static void
+ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char
*basis64, int is_url)
{
u_char *d, *s;
size_t len;
- static u_char basis64[] =
-
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
len = src->len;
s = src->data;
@@ -1084,20 +1082,40 @@
if (len == 1) {
*d++ = basis64[(s[0] & 3) << 4];
- *d++ = '=';
+ if (!is_url)
+ *d++ = '=';
} else {
*d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
*d++ = basis64[(s[1] & 0x0f) << 2];
}
- *d++ = '=';
+ if (!is_url)
+ *d++ = '=';
}
dst->len = d - dst->data;
}
+void
+ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)
+{
+ static u_char basis64[] =
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ ngx_encode_base64_internal(dst, src, basis64, 0);
+}
+
+
+void
+ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src)
+{
+ static u_char basis64[] =
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+ ngx_encode_base64_internal(dst, src, basis64, 1);
+}
+
+
ngx_int_t
ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)
{
Posted at Nginx Forum:
http://forum.nginx.org/read.php?21,229965,229965#msg-229965
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|