Quoting.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #include "squid.h"
10 #include "format/Quoting.h"
11 
12 static const char c2x[] =
13  "000102030405060708090a0b0c0d0e0f"
14  "101112131415161718191a1b1c1d1e1f"
15  "202122232425262728292a2b2c2d2e2f"
16  "303132333435363738393a3b3c3d3e3f"
17  "404142434445464748494a4b4c4d4e4f"
18  "505152535455565758595a5b5c5d5e5f"
19  "606162636465666768696a6b6c6d6e6f"
20  "707172737475767778797a7b7c7d7e7f"
21  "808182838485868788898a8b8c8d8e8f"
22  "909192939495969798999a9b9c9d9e9f"
23  "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
24  "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
25  "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
26  "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
27  "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
28  "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
29 
30 char *
32 {
33  if (nullptr == name)
34  return nullptr;
35 
36  if (name[0] == '\0')
37  return nullptr;
38 
39  return QuoteMimeBlob(name);
40 }
41 
42 char *
43 Format::QuoteMimeBlob(const char *header)
44 {
45  int c;
46  int i;
47  char *buf;
48  char *buf_cursor;
49 
50  if (header == nullptr) {
51  buf = static_cast<char *>(xcalloc(1, 1));
52  *buf = '\0';
53  return buf;
54  }
55 
56  buf = static_cast<char *>(xcalloc(1, (strlen(header) * 3) + 1));
57  buf_cursor = buf;
58  /*
59  * Whe OLD_LOG_MIME is defined we escape: \x00-\x1F"#%;<>?{}|\\\\^~`\[\]\x7F-\xFF
60  * which is the default escape list for the CPAN Perl5 URI module
61  * modulo the inclusion of space (x40) to make the raw logs a bit
62  * more readable.
63  */
64 
65  while ((c = *(const unsigned char *) header++) != '\0') {
66 #if !OLD_LOG_MIME
67  if (c == '\r') {
68  *buf_cursor = '\\';
69  ++buf_cursor;
70  *buf_cursor = 'r';
71  ++buf_cursor;
72  } else if (c == '\n') {
73  *buf_cursor = '\\';
74  ++buf_cursor;
75  *buf_cursor = 'n';
76  ++buf_cursor;
77  } else
78 #endif
79  if (c <= 0x1F
80  || c >= 0x7F
81  || c == '%'
82 #if OLD_LOG_MIME
83  || c == '"'
84  || c == '#'
85  || c == ';'
86  || c == '<'
87  || c == '>'
88  || c == '?'
89  || c == '{'
90  || c == '}'
91  || c == '|'
92  || c == '\\'
93  || c == '^'
94  || c == '~'
95  || c == '`'
96 #endif
97  || c == '['
98  || c == ']') {
99  *buf_cursor = '%';
100  ++buf_cursor;
101  i = c * 2;
102  *buf_cursor = c2x[i];
103  ++buf_cursor;
104  *buf_cursor = c2x[i + 1];
105  ++buf_cursor;
106 #if !OLD_LOG_MIME
107 
108  } else if (c == '\\') {
109  *buf_cursor = '\\';
110  ++buf_cursor;
111  *buf_cursor = '\\';
112  ++buf_cursor;
113 #endif
114 
115  } else {
116  *buf_cursor = (char) c;
117  ++buf_cursor;
118  }
119  }
120 
121  *buf_cursor = '\0';
122  return buf;
123 }
124 
void * xcalloc(size_t n, size_t sz)
Definition: xalloc.cc:71
static const char c2x[]
Definition: Quoting.cc:12
char * QuoteMimeBlob(const char *header)
Definition: Quoting.cc:43
char * QuoteUrlEncodeUsername(const char *name)
Definition: Quoting.cc:31

 

Introduction

Documentation

Support

Miscellaneous