costin 02/04/18 19:36:48
Modified: jk/native2/common jk_requtil.c
Log:
Moved code from the isapi connector.
Common code in common/ dir :-)
Revision Changes Path
1.11 +256 -0 jakarta-tomcat-connectors/jk/native2/common/jk_requtil.c
Index: jk_requtil.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_requtil.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- jk_requtil.c 20 Mar 2002 23:41:32 -0000 1.10
+++ jk_requtil.c 19 Apr 2002 02:36:48 -0000 1.11
@@ -730,6 +730,262 @@
return JK_FALSE;
}
+/* -------------------- Request encoding -------------------- */
+/* Moved from IIS adapter */
+
+#define T_OS_ESCAPE_PATH (4)
+
+static const unsigned char test_char_table[256] = {
+ 0,14,14,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,14,14,
+ 14,14,14,14,14,14,14,14,14,14,14,14,14,0,7,6,1,6,1,1,
+ 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,8,15,
+ 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,15,15,15,7,0,7,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,15,7,15,1,14,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
+};
+
+#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f))
+
+static const char c2x_table[] = "0123456789abcdef";
+
+static unsigned char *c2x(unsigned what, unsigned char *where)
+{
+ *where++ = '%';
+ *where++ = c2x_table[what >> 4];
+ *where++ = c2x_table[what & 0xf];
+ return where;
+}
+
+int jk_requtil_escapeUrl(const char *path, char *dest, int destsize)
+{
+ const unsigned char *s = (const unsigned char *)path;
+ unsigned char *d = (unsigned char *)dest;
+ unsigned char *e = dest + destsize - 1;
+ unsigned char *ee = dest + destsize - 3;
+ unsigned c;
+
+ while ((c = *s)) {
+ if (TEST_CHAR(c, T_OS_ESCAPE_PATH)) {
+ if (d >= ee )
+ return JK_FALSE;
+ d = c2x(c, d);
+ }
+ else {
+ if (d >= e )
+ return JK_FALSE;
+ *d++ = c;
+ }
+ ++s;
+ }
+ *d = '\0';
+ return JK_TRUE;
+}
+
+/* XXX Make it a default checking in uri worker map
+ */
+int jk_requtil_uriIsWebInf(char *uri)
+{
+ char *c = uri;
+ while(*c) {
+ *c = tolower(*c);
+ c++;
+ }
+ if(strstr(uri, "web-inf")) {
+ return JK_TRUE;
+ }
+ if(strstr(uri, "meta-inf")) {
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+static char x2c(const char *what)
+{
+ register char digit;
+
+ digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0'));
+ digit *= 16;
+ digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0'));
+ return (digit);
+}
+
+int jk_requtil_unescapeUrl(char *url)
+{
+ register int x, y, badesc, badpath;
+
+ badesc = 0;
+ badpath = 0;
+ for (x = 0, y = 0; url[y]; ++x, ++y) {
+ if (url[y] != '%')
+ url[x] = url[y];
+ else {
+ if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) {
+ badesc = 1;
+ url[x] = '%';
+ }
+ else {
+ url[x] = x2c(&url[y + 1]);
+ y += 2;
+ if (url[x] == '/' || url[x] == '\0')
+ badpath = 1;
+ }
+ }
+ }
+ url[x] = '\0';
+ if (badesc)
+ return -1;
+ else if (badpath)
+ return -2;
+ else
+ return 0;
+}
+
+void jk_requtil_getParents(char *name)
+{
+ int l, w;
+
+ /* Four paseses, as per RFC 1808 */
+ /* a) remove ./ path segments */
+
+ for (l = 0, w = 0; name[l] != '\0';) {
+ if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l -
1] == '/'))
+ l += 2;
+ else
+ name[w++] = name[l++];
+ }
+
+ /* b) remove trailing . path, segment */
+ if (w == 1 && name[0] == '.')
+ w--;
+ else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/')
+ w--;
+ name[w] = '\0';
+
+ /* c) remove all xx/../ segments. (including leading ../ and /../) */
+ l = 0;
+
+ while (name[l] != '\0') {
+ if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/'
&&
+ (l == 0 || name[l - 1] == '/')) {
+ register int m = l + 3, n;
+
+ l = l - 2;
+ if (l >= 0) {
+ while (l >= 0 && name[l] != '/')
+ l--;
+ l++;
+ }
+ else
+ l = 0;
+ n = l;
+ while ((name[n] = name[m]))
+ (++n, ++m);
+ }
+ else
+ ++l;
+ }
+
+ /* d) remove trailing xx/.. segment. */
+ if (l == 2 && name[0] == '.' && name[1] == '.')
+ name[0] = '\0';
+ else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' &&
name[l - 3] == '/') {
+ l = l - 4;
+ if (l >= 0) {
+ while (l >= 0 && name[l] != '/')
+ l--;
+ l++;
+ }
+ else
+ l = 0;
+ name[l] = '\0';
+ }
+}
+
+
+
+
+static const char begin_cert [] =
+ "-----BEGIN CERTIFICATE-----\r\n";
+
+static const char end_cert [] =
+ "-----END CERTIFICATE-----\r\n";
+
+static const char basis_64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+int jk_requtil_base64CertLen(int len)
+{
+ int n = ((len + 2) / 3 * 4) + 1; // base64 encoded size
+ n += (n + 63 / 64) * 2; // add CRLF's
+ n += sizeof(begin_cert) + sizeof(end_cert) - 2; // add enclosing strings.
+ return n;
+}
+
+int jk_requtil_base64EncodeCert(char *encoded,
+ const unsigned char *string, int len)
+{
+ int i,c;
+ char *p;
+ const char *t;
+
+ p = encoded;
+
+ t = begin_cert;
+ while (*t != '\0')
+ *p++ = *t++;
+
+ c = 0;
+ for (i = 0; i < len - 2; i += 3) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int) (string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2) |
+ ((int) (string[i + 2] & 0xC0) >> 6)];
+ *p++ = basis_64[string[i + 2] & 0x3F];
+ c += 4;
+ if ( c >= 64 ) {
+ *p++ = '\r';
+ *p++ = '\n';
+ c = 0;
+ }
+ }
+ if (i < len) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ if (i == (len - 1)) {
+ *p++ = basis_64[((string[i] & 0x3) << 4)];
+ *p++ = '=';
+ }
+ else {
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int) (string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
+ }
+ *p++ = '=';
+ c++;
+ }
+ if ( c != 0 ) {
+ *p++ = '\r';
+ *p++ = '\n';
+ }
+
+ t = end_cert;
+ while (*t != '\0')
+ *p++ = *t++;
+
+ *p++ = '\0';
+ return p - encoded;
+}
+
+
+
/** Initialize the request
*
--
To unsubscribe, e-mail: <mailto:tomcat-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>
|