• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KIO

  • kio
  • httpfilter
httpfilter.cc
Go to the documentation of this file.
1/*
2 This file is part of the KDE libraries
3 Copyright (c) 2002 Waldo Bastian <bastian@kde.org>
4 Copyright 2009 David Faure <faure@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License version 2 as published by the Free Software Foundation.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include "httpfilter.h"
22#include <kgzipfilter.h>
23#include <kdebug.h>
24
25#include <klocale.h>
26
27#include <stdio.h>
28
29HTTPFilterBase::HTTPFilterBase()
30 : last(0)
31{
32}
33
34HTTPFilterBase::~HTTPFilterBase()
35{
36 delete last;
37}
38
39void
40HTTPFilterBase::chain(HTTPFilterBase *previous)
41{
42 last = previous;
43 connect(last, SIGNAL(output(QByteArray)),
44 this, SLOT(slotInput(QByteArray)));
45}
46
47HTTPFilterChain::HTTPFilterChain()
48 : first(0)
49{
50}
51
52void
53HTTPFilterChain::addFilter(HTTPFilterBase *filter)
54{
55 if (!last)
56 {
57 first = filter;
58 }
59 else
60 {
61 disconnect(last, SIGNAL(output(QByteArray)), 0, 0);
62 filter->chain(last);
63 }
64 last = filter;
65 connect(filter, SIGNAL(output(QByteArray)),
66 this, SIGNAL(output(QByteArray)));
67 connect(filter, SIGNAL(error(QString)),
68 this, SIGNAL(error(QString)));
69}
70
71void
72HTTPFilterChain::slotInput(const QByteArray &d)
73{
74 if (first)
75 first->slotInput(d);
76 else
77 emit output(d);
78}
79
80HTTPFilterMD5::HTTPFilterMD5()
81{
82}
83
84QString
85HTTPFilterMD5::md5()
86{
87 return QString::fromLatin1(context.base64Digest());
88}
89
90void
91HTTPFilterMD5::slotInput(const QByteArray &d)
92{
93 context.update(d);
94 emit output(d);
95}
96
97
98HTTPFilterGZip::HTTPFilterGZip(bool deflate)
99 : m_deflateMode(deflate),
100 m_firstData(true),
101 m_finished(false)
102{
103 // We can't use KFilterDev because it assumes it can read as much data as necessary
104 // from the underlying device. It's a pull strategy, while we have to do
105 // a push strategy.
106 m_gzipFilter = new KGzipFilter;
107}
108
109HTTPFilterGZip::~HTTPFilterGZip()
110{
111 m_gzipFilter->terminate();
112 delete m_gzipFilter;
113
114}
115
116/*
117 The data format used by the zlib library is described by RFCs (Request for
118 Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
119 (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
120
121 Use /usr/include/zlib.h as the primary source of documentation though.
122*/
123
124void
125HTTPFilterGZip::slotInput(const QByteArray &d)
126{
127 if (d.isEmpty())
128 return;
129
130 //kDebug() << "Got" << d.size() << "bytes as input";
131 if (m_firstData) {
132 if (m_deflateMode) {
133 bool zlibHeader = true;
134 // Autodetect broken webservers (thanks Microsoft) who send raw-deflate
135 // instead of zlib-headers-deflate when saying Content-Encoding: deflate.
136 const unsigned char firstChar = d[0];
137 if ((firstChar & 0x0f) != 8) {
138 // In a zlib header, CM should be 8 (cf RFC 1950)
139 zlibHeader = false;
140 } else if (d.size() > 1) {
141 const unsigned char flg = d[1];
142 if ((firstChar * 256 + flg) % 31 != 0) { // Not a multiple of 31? invalid zlib header then
143 zlibHeader = false;
144 }
145 }
146 //if (!zlibHeader)
147 // kDebug() << "Bad webserver, uses raw-deflate instead of zlib-deflate...";
148 m_gzipFilter->init(QIODevice::ReadOnly, zlibHeader ? KGzipFilter::ZlibHeader : KGzipFilter::RawDeflate);
149 } else {
150 m_gzipFilter->init(QIODevice::ReadOnly, KGzipFilter::GZipHeader);
151 }
152 m_firstData = false;
153 }
154
155 m_gzipFilter->setInBuffer(d.constData(), d.size());
156
157 while (!m_gzipFilter->inBufferEmpty() && !m_finished) {
158 char buf[8192];
159 m_gzipFilter->setOutBuffer(buf, sizeof(buf));
160 KFilterBase::Result result = m_gzipFilter->uncompress();
161 //kDebug() << "uncompress returned" << result;
162 switch (result) {
163 case KFilterBase::Ok:
164 case KFilterBase::End:
165 {
166 const int bytesOut = sizeof(buf) - m_gzipFilter->outBufferAvailable();
167 if (bytesOut) {
168 emit output(QByteArray(buf, bytesOut));
169 }
170 if (result == KFilterBase::End) {
171 //kDebug() << "done, bHasFinished=true";
172 emit output(QByteArray());
173 m_finished = true;
174 }
175 break;
176 }
177 case KFilterBase::Error:
178 kWarning() << "Error from KGZipFilter";
179 emit error(i18n("Receiving corrupt data."));
180 m_finished = true; // exit this while loop
181 break;
182 }
183 }
184}
185
186HTTPFilterDeflate::HTTPFilterDeflate()
187 : HTTPFilterGZip(true)
188{
189}
190
191#include "httpfilter.moc"
HTTPFilterBase
Definition: httpfilter.h:33
HTTPFilterBase::error
void error(const QString &)
HTTPFilterBase::output
void output(const QByteArray &d)
HTTPFilterBase::~HTTPFilterBase
~HTTPFilterBase()
Definition: httpfilter.cc:34
HTTPFilterBase::HTTPFilterBase
HTTPFilterBase()
Definition: httpfilter.cc:29
HTTPFilterBase::slotInput
virtual void slotInput(const QByteArray &d)=0
HTTPFilterBase::last
HTTPFilterBase * last
Definition: httpfilter.h:49
HTTPFilterBase::chain
void chain(HTTPFilterBase *previous)
Definition: httpfilter.cc:40
HTTPFilterChain::HTTPFilterChain
HTTPFilterChain()
Definition: httpfilter.cc:47
HTTPFilterChain::addFilter
void addFilter(HTTPFilterBase *filter)
Definition: httpfilter.cc:53
HTTPFilterChain::slotInput
void slotInput(const QByteArray &d)
Definition: httpfilter.cc:72
HTTPFilterDeflate::HTTPFilterDeflate
HTTPFilterDeflate()
Definition: httpfilter.cc:186
HTTPFilterGZip
Definition: httpfilter.h:84
HTTPFilterGZip::slotInput
void slotInput(const QByteArray &d)
Definition: httpfilter.cc:125
HTTPFilterGZip::~HTTPFilterGZip
~HTTPFilterGZip()
Definition: httpfilter.cc:109
HTTPFilterGZip::HTTPFilterGZip
HTTPFilterGZip(bool deflate=false)
Definition: httpfilter.cc:98
HTTPFilterMD5::slotInput
void slotInput(const QByteArray &d)
Definition: httpfilter.cc:91
HTTPFilterMD5::md5
QString md5()
Definition: httpfilter.cc:85
HTTPFilterMD5::HTTPFilterMD5
HTTPFilterMD5()
Definition: httpfilter.cc:80
KFilterBase::Result
Result
KFilterBase::Error
Error
KFilterBase::End
End
KFilterBase::Ok
Ok
KFilterBase::inBufferEmpty
virtual bool inBufferEmpty() const
KGzipFilter
KGzipFilter::setInBuffer
virtual void setInBuffer(const char *data, uint size)
KGzipFilter::setOutBuffer
virtual void setOutBuffer(char *data, uint maxlen)
KGzipFilter::ZlibHeader
ZlibHeader
KGzipFilter::RawDeflate
RawDeflate
KGzipFilter::GZipHeader
GZipHeader
KGzipFilter::uncompress
virtual Result uncompress()
KGzipFilter::init
virtual void init(int mode)
KGzipFilter::terminate
virtual void terminate()
KGzipFilter::outBufferAvailable
virtual int outBufferAvailable() const
KMD5::update
void update(const char *in, int len=-1)
KMD5::base64Digest
QByteArray base64Digest()
kWarning
#define kWarning
httpfilter.h
kdebug.h
kgzipfilter.h
klocale.h
i18n
QString i18n(const char *text)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal