From 830032294517ab286b424639fcf65435826d42c3 Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Mon, 26 Sep 2011 18:42:45 +0000
Subject: Implement NSAPI RESPONSE_HEADERS in nsplugin.

Cherry picked from KDE4, acknowledgements to Maksim Orlovich for the fix,
and to Nick Leverton for the TDE backport.


git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1255714 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
---
 nsplugins/sdk/npapi.h         | 25 +++++++++++++++++++++++++
 nsplugins/viewer/nsplugin.cpp | 11 +++++++----
 nsplugins/viewer/nsplugin.h   |  1 +
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/nsplugins/sdk/npapi.h b/nsplugins/sdk/npapi.h
index 67b91b680..16c71b97a 100644
--- a/nsplugins/sdk/npapi.h
+++ b/nsplugins/sdk/npapi.h
@@ -256,6 +256,16 @@ typedef struct _NPStream
   uint32 end;
   uint32 lastmodified;
   void*  notifyData;
+  const char* headers;  /* Response headers from host.
+			 * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS.
+			 * Used for HTTP only; NULL for non-HTTP.
+			 * Available from NPP_NewStream onwards.
+			 * Plugin should copy this data before storing it.
+			 * Includes HTTP status line and all headers,
+			 * preferably verbatim as received from server,
+			 * headers formatted as in HTTP ("Header: Value"),
+			 * and newlines (\n, NOT \r\n) separating lines.
+			 * Terminated by \n\0 (NOT \n\n\0). */
 } NPStream;
 
 
@@ -602,6 +612,21 @@ enum NPEventType {
 #define NPVERS_68K_HAS_LIVECONNECT   11
 #define NPVERS_HAS_WINDOWLESS        11
 #define NPVERS_HAS_XPCONNECT_SCRIPTING 13
+// Trinity note: we claim 13 right now, though we do
+// have response_headers.
+#define NPVERS_HAS_NPRUNTIME_SCRIPTING      14
+#define NPVERS_HAS_FORM_VALUES              15
+#define NPVERS_HAS_POPUPS_ENABLED_STATE     16
+#define NPVERS_HAS_RESPONSE_HEADERS         17
+#define NPVERS_HAS_NPOBJECT_ENUM            18
+#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19
+#define NPVERS_HAS_ALL_NETWORK_STREAMS      20
+#define NPVERS_HAS_URL_AND_AUTH_INFO        21
+#define NPVERS_HAS_PRIVATE_MODE             22
+#define NPVERS_MACOSX_HAS_COCOA_EVENTS      23
+#define NPVERS_HAS_ADVANCED_KEY_HANDLING    25
+#define NPVERS_HAS_URL_REDIRECT_HANDLING    26
+#define NPVERS_HAS_CLEAR_SITE_DATA          27
 
 /*----------------------------------------------------------------------*/
 /*                        Function Prototypes                           */
diff --git a/nsplugins/viewer/nsplugin.cpp b/nsplugins/viewer/nsplugin.cpp
index fe2dabfbf..0f56f055f 100644
--- a/nsplugins/viewer/nsplugin.cpp
+++ b/nsplugins/viewer/nsplugin.cpp
@@ -1674,6 +1674,7 @@ bool NSPluginStreamBase::create( const TQString& url, const TQString& mimeType,
     _stream->pdata = 0;
     _stream->lastmodified = 0;
     _stream->notifyData = _notifyData;
+    _stream->headers = 0;
 
     _mimeType = mimeType;
 
@@ -1898,6 +1899,7 @@ bool NSPluginStream::get( const TQString& url, const TQString& mimeType,
         _job = KIO::get(KURL( url ), false, false);
         _job->addMetaData("errorPage", "false");
         _job->addMetaData("AllowCompressedPage", "false");
+        _job->addMetaData("PropagateHttpHeader", "true");
         if (reload) {
             _job->addMetaData("cache", "reload");
         }
@@ -1925,6 +1927,7 @@ bool NSPluginStream::post( const TQString& url, const TQByteArray& data,
         _job = KIO::http_post(KURL( url ), data, false);
         _job->addMetaData("content-type", args.contentType());
         _job->addMetaData("errorPage", "false");
+        _job->addMetaData("PropagateHttpHeader", "true");
         _job->addMetaData("AllowCompressedPage", "false");
         connect(_job, TQT_SIGNAL(data(KIO::Job *, const TQByteArray &)),
                 TQT_SLOT(data(KIO::Job *, const TQByteArray &)));
@@ -1964,13 +1967,13 @@ void NSPluginStream::totalSize(KIO::Job * job, KIO::filesize_t size)
 
 void NSPluginStream::mimetype(KIO::Job * job, const TQString &mimeType)
 {
-    kdDebug(1431) << "NSPluginStream::TQByteArray - job=" << (void*)job << " mimeType=" << mimeType << endl;
+    kdDebug(1431) << "NSPluginStream::mimetype - job=" << (void*)job << " mimeType=" << mimeType << endl;
     _mimeType = mimeType;
+    TQString tmp_headers = job->metaData()["HTTP-Headers"];
+    _headers.duplicate(tmp_headers.latin1(), tmp_headers.length());
+    _stream->headers = _headers.data();
 }
 
-
-
-
 void NSPluginStream::resume()
 {
    if ( error() || tries()>8 ) {
diff --git a/nsplugins/viewer/nsplugin.h b/nsplugins/viewer/nsplugin.h
index 1c241cc8e..2a2af35d5 100644
--- a/nsplugins/viewer/nsplugin.h
+++ b/nsplugins/viewer/nsplugin.h
@@ -95,6 +95,7 @@ protected:
   KURL _url;
   TQString _fileURL;
   TQString _mimeType;
+  TQByteArray _headers;
   TQByteArray _data;
   class KTempFile *_tempFile;
 
-- 
cgit v1.2.3

