void QHttpNetworkReplyPrivate::parseHeader(const QByteArray &header) { // see rfc2616, sec 4 for information about HTTP/1.1 headers. // allows relaxed parsing here, accepts both CRLF & LF line endings const QByteArrayMatcher lf("\n"); const QByteArrayMatcher colon(":"); int i = 0; while (i < header.count()) { int j = colon.indexIn(header, i); // field-name if (j == -1) break; const QByteArray field = header.mid(i, j - i).trimmed(); j++; // any number of LWS is allowed before and after the value QByteArray value; do { i = lf.indexIn(header, j); if (i == -1) break; if (!value.isEmpty()) value += ' '; // check if we have CRLF or only LF bool hasCR = (i && header[i-1] == '\r'); int length = i -(hasCR ? 1: 0) - j; value += header.mid(j, length).trimmed(); j = ++i; } while (i < header.count() && (header.at(i) == ' ' || header.at(i) == '\t')); if (i == -1) break; // something is wrong fields.append(qMakePair(field, value)); } }
/*! \internal Returns a PEM key formatted as DER. */ QByteArray QSslKeyPrivate::derFromPem(const QByteArray &pem, QMap<QByteArray, QByteArray> *headers) const { const QByteArray header = pemHeader(); const QByteArray footer = pemFooter(); QByteArray der(pem); const int headerIndex = der.indexOf(header); const int footerIndex = der.indexOf(footer); if (headerIndex == -1 || footerIndex == -1) return QByteArray(); der = der.mid(headerIndex + header.size(), footerIndex - (headerIndex + header.size())); if (der.contains("Proc-Type:")) { // taken from QHttpNetworkReplyPrivate::parseHeader const QByteArrayMatcher lf("\n"); const QByteArrayMatcher colon(":"); int i = 0; while (i < der.count()) { int j = colon.indexIn(der, i); // field-name if (j == -1) break; const QByteArray field = der.mid(i, j - i).trimmed(); j++; // any number of LWS is allowed before and after the value QByteArray value; do { i = lf.indexIn(der, j); if (i == -1) break; if (!value.isEmpty()) value += ' '; // check if we have CRLF or only LF bool hasCR = (i && der[i-1] == '\r'); int length = i -(hasCR ? 1: 0) - j; value += der.mid(j, length).trimmed(); j = ++i; } while (i < der.count() && (der.at(i) == ' ' || der.at(i) == '\t')); if (i == -1) break; // something is wrong headers->insert(field, value); } der = der.mid(i); } return QByteArray::fromBase64(der); // ignores newlines }
void tst_QByteArrayMatcher::indexIn() { const char p_data[] = { 0x0, 0x0, 0x1 }; QByteArray pattern(p_data, sizeof(p_data)); QByteArray haystack(8, '\0'); haystack[7] = 0x1; matcher = QByteArrayMatcher(pattern); QCOMPARE(matcher.indexIn(haystack, 0), 5); QCOMPARE(matcher.indexIn(haystack, 1), 5); QCOMPARE(matcher.indexIn(haystack, 2), 5); matcher.setPattern(pattern); QCOMPARE(matcher.indexIn(haystack, 0), 5); QCOMPARE(matcher.indexIn(haystack, 1), 5); QCOMPARE(matcher.indexIn(haystack, 2), 5); }
void tst_QByteArrayMatcher::interface() { const char needle[] = "abc123"; QByteArray haystack(500, 'a'); haystack.insert(6, "123"); haystack.insert(31, "abc"); haystack.insert(42, "abc123"); haystack.insert(84, "abc123"); matcher1 = QByteArrayMatcher(QByteArray(needle)); QByteArrayMatcher matcher2; matcher2.setPattern(QByteArray(needle)); QByteArrayMatcher matcher3 = QByteArrayMatcher(QByteArray(needle)); QByteArrayMatcher matcher4(needle, sizeof(needle) - 1); QByteArrayMatcher matcher5(matcher2); QByteArrayMatcher matcher6; matcher6 = matcher3; QCOMPARE(matcher1.indexIn(haystack), 42); QCOMPARE(matcher2.indexIn(haystack), 42); QCOMPARE(matcher3.indexIn(haystack), 42); QCOMPARE(matcher4.indexIn(haystack), 42); QCOMPARE(matcher5.indexIn(haystack), 42); QCOMPARE(matcher6.indexIn(haystack), 42); QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length()), 42); QCOMPARE(matcher1.indexIn(haystack, 43), 84); QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length(), 43), 84); QCOMPARE(matcher1.indexIn(haystack, 85), -1); QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length(), 85), -1); QByteArrayMatcher matcher7(QByteArray("123")); QCOMPARE(matcher7.indexIn(haystack), 6); matcher7 = QByteArrayMatcher(QByteArray("abc")); QCOMPARE(matcher7.indexIn(haystack), 31); matcher7.setPattern(matcher4.pattern()); QCOMPARE(matcher7.indexIn(haystack), 42); }