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

KIO

  • sources
  • kde-4.12
  • kdelibs
  • 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 
29 HTTPFilterBase::HTTPFilterBase()
30  : last(0)
31 {
32 }
33 
34 HTTPFilterBase::~HTTPFilterBase()
35 {
36  delete last;
37 }
38 
39 void
40 HTTPFilterBase::chain(HTTPFilterBase *previous)
41 {
42  last = previous;
43  connect(last, SIGNAL(output(QByteArray)),
44  this, SLOT(slotInput(QByteArray)));
45 }
46 
47 HTTPFilterChain::HTTPFilterChain()
48  : first(0)
49 {
50 }
51 
52 void
53 HTTPFilterChain::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 
71 void
72 HTTPFilterChain::slotInput(const QByteArray &d)
73 {
74  if (first)
75  first->slotInput(d);
76  else
77  emit output(d);
78 }
79 
80 HTTPFilterMD5::HTTPFilterMD5()
81 {
82 }
83 
84 QString
85 HTTPFilterMD5::md5()
86 {
87  return QString::fromLatin1(context.base64Digest());
88 }
89 
90 void
91 HTTPFilterMD5::slotInput(const QByteArray &d)
92 {
93  context.update(d);
94  emit output(d);
95 }
96 
97 
98 HTTPFilterGZip::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 
109 HTTPFilterGZip::~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 
124 void
125 HTTPFilterGZip::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 
186 HTTPFilterDeflate::HTTPFilterDeflate()
187  : HTTPFilterGZip(true)
188 {
189 }
190 
191 #include "httpfilter.moc"
i18n
QString i18n(const char *text)
KGzipFilter::RawDeflate
KGzipFilter::GZipHeader
HTTPFilterBase::error
void error(const QString &)
kdebug.h
HTTPFilterChain::slotInput
void slotInput(const QByteArray &d)
Definition: httpfilter.cc:72
KGzipFilter::setInBuffer
virtual void setInBuffer(const char *data, uint size)
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
KGzipFilter::setOutBuffer
virtual void setOutBuffer(char *data, uint maxlen)
QString
kgzipfilter.h
klocale.h
KGzipFilter::ZlibHeader
HTTPFilterBase::HTTPFilterBase
HTTPFilterBase()
Definition: httpfilter.cc:29
HTTPFilterMD5::HTTPFilterMD5
HTTPFilterMD5()
Definition: httpfilter.cc:80
KGzipFilter::terminate
virtual void terminate()
KGzipFilter
KFilterBase::inBufferEmpty
virtual bool inBufferEmpty() const
HTTPFilterBase::~HTTPFilterBase
~HTTPFilterBase()
Definition: httpfilter.cc:34
HTTPFilterBase::output
void output(const QByteArray &d)
httpfilter.h
KFilterBase::End
KMD5::update
void update(const char *in, int len=-1)
KGzipFilter::outBufferAvailable
virtual int outBufferAvailable() const
HTTPFilterBase::chain
void chain(HTTPFilterBase *previous)
Definition: httpfilter.cc:40
KGzipFilter::uncompress
virtual Result uncompress()
HTTPFilterChain::HTTPFilterChain
HTTPFilterChain()
Definition: httpfilter.cc:47
HTTPFilterGZip::slotInput
void slotInput(const QByteArray &d)
Definition: httpfilter.cc:125
HTTPFilterDeflate::HTTPFilterDeflate
HTTPFilterDeflate()
Definition: httpfilter.cc:186
KGzipFilter::init
virtual void init(int mode)
HTTPFilterBase::slotInput
virtual void slotInput(const QByteArray &d)=0
HTTPFilterGZip::~HTTPFilterGZip
~HTTPFilterGZip()
Definition: httpfilter.cc:109
HTTPFilterGZip
Definition: httpfilter.h:83
KFilterBase::Result
Result
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
HTTPFilterChain::addFilter
void addFilter(HTTPFilterBase *filter)
Definition: httpfilter.cc:53
KFilterBase::Ok
HTTPFilterBase::last
HTTPFilterBase * last
Definition: httpfilter.h:49
KMD5::base64Digest
QByteArray base64Digest()
KFilterBase::Error
HTTPFilterBase
Definition: httpfilter.h:32
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:50:01 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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