[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    content-disposition in HTTP headers
From:       Allan Sandfeld Jensen <kde () carewolf ! com>
Date:       2006-03-11 16:34:40
Message-ID: 200603111734.40803.kde () carewolf ! com
[Download RAW message or body]

Hi

It doesn't seems like Konqueror is honoring content-disposition:attachment in 
HTTP. Though the bug http://bugs.kde.org/show_bug.cgi?id=31662 has been 
closed. I think maybe the bug regressed after closing 
http://bugs.kde.org/show_bug.cgi?id=33769, since we do not parse the filename 
and type separately.

The following patch implements separate passing of the content-disposition 
type and filename, and uses the type to decide on embedding in konq_run.

Is it a problem that I rename the meta-data name in the http kioslave? Should 
I instead keep the filename as content-disposition and put the type under a 
new name?

`Allan

["content-disposition.diff" (text/x-diff)]

Index: kdelibs/kparts/browserrun.h
===================================================================
--- kdelibs/kparts/browserrun.h	(revision 517591)
+++ kdelibs/kparts/browserrun.h	(working copy)
@@ -75,22 +75,27 @@
 
         //KParts::URLArgs urlArgs() const { return m_args; }
         //KParts::ReadOnlyPart* part() const { return m_part; }
-	
+
 	/**
 	 * @return the URL we're probing
 	 */
         KURL url() const { return m_strURL; }
-	
+
 	/**
 	 * @return true if no dialog will be shown in case of errors
 	 */
         bool hideErrorDialog() const;
-        
+
         /**
-	 * @return Suggested filename given by the server (e.g. HTTP content-disposition)
+	 * @return Suggested filename given by the server (e.g. HTTP content-disposition filename)
 	 */
         QString suggestedFilename() const { return m_suggestedFilename; }
-        
+
+        /**
+	 * @return Suggested disposition by the server (e.g. HTTP content-disposition)
+	 */
+        QString contentDisposition() const;
+
         enum AskSaveResult { Save, Open, Cancel };
         /**
          * Ask the user whether to save or open a url in another application.
Index: kdelibs/kparts/browserrun.cpp
===================================================================
--- kdelibs/kparts/browserrun.cpp	(revision 517591)
+++ kdelibs/kparts/browserrun.cpp	(working copy)
@@ -36,6 +36,7 @@
 {
 public:
   bool m_bHideErrorDialog;
+  QString contentDisposition;
 };
 
 BrowserRun::BrowserRun( const KURL& url, const KParts::URLArgs& args,
@@ -185,7 +186,8 @@
   m_strURL = job->url();
   kdDebug(1000) << "slotBrowserMimetype: found " << type << " for " << m_strURL.prettyURL() << endl;
 
-  m_suggestedFilename = job->queryMetaData("content-disposition");
+  m_suggestedFilename = job->queryMetaData("content-disposition-filename");
+  d->contentDisposition = job->queryMetaData("content-disposition");
   //kdDebug(1000) << "m_suggestedFilename=" << m_suggestedFilename << endl;
 
   // Make a copy to avoid a dead reference
@@ -507,4 +509,8 @@
     return d->m_bHideErrorDialog;
 }
 
+QString BrowserRun::contentDisposition() const {
+    return d->contentDisposition;
+}
+
 #include "browserrun.moc"
Index: kdelibs/kioslave/http/http.cc
===================================================================
--- kdelibs/kioslave/http/http.cc	(revision 517591)
+++ kdelibs/kioslave/http/http.cc	(working copy)
@@ -2711,6 +2711,7 @@
   QCString cookieStr; // In case we get a cookie.
 
   QString disposition; // Incase we get a Content-Disposition
+  QString dispositionFilename; // Incase we get a Content-Disposition filename
   QString mediaValue;
   QString mediaAttribute;
 
@@ -3245,7 +3246,7 @@
               dispositionBuf--;
 
             if ( dispositionBuf > bufStart )
-              disposition = QString::fromLatin1( bufStart, dispositionBuf-bufStart );
+              dispositionFilename = QString::fromLatin1( bufStart, dispositionBuf-bufStart );
 
             break;
           }
@@ -3267,15 +3268,15 @@
 
       // Content-Dispostion is not allowed to dictate directory
       // path, thus we extract the filename only.
-      if ( !disposition.isEmpty() )
+      if ( !dispositionFilename.isEmpty() )
       {
-        int pos = disposition.findRev( '/' );
+        int pos = dispositionFilename.findRev( '/' );
 
         if( pos > -1 )
-          disposition = disposition.mid(pos+1);
+          dispositionFilename = dispositionFilename.mid(pos+1);
 
-        kdDebug(7113) << "(" << m_pid << ") Content-Disposition: "
-                      << disposition<< endl;
+        kdDebug(7113) << "(" << m_pid << ") Content-Disposition: filename="
+                      << dispositionFilename<< endl;
       }
     }
     else if (strncasecmp(buf, "Proxy-Connection:", 17) == 0)
@@ -3754,6 +3755,12 @@
                   << disposition << endl;
     setMetaData("content-disposition", disposition);
   }
+  if( !dispositionFilename.isEmpty() )
+  {
+    kdDebug(7113) << "(" << m_pid << ") Setting Content-Disposition filename metadata to: "
+                  << dispositionFilename << endl;
+    setMetaData("content-disposition-filename", dispositionFilename);
+  }
 
   if (!m_request.lastModified.isEmpty())
     setMetaData("modified", m_request.lastModified);
Index: kdebase/konqueror/konq_run.cc
===================================================================
--- kdebase/konqueror/konq_run.cc	(revision 517591)
+++ kdebase/konqueror/konq_run.cc	(working copy)
@@ -80,11 +80,9 @@
 
   bool tryEmbed = true;
   // One case where we shouldn't try to embed, is when the server asks us to save
-  // ####### only if content-disposition doesn't say inline
-#if 0
-  if ( !m_suggestedFilename.isEmpty() )
+  if ( contentDisposition() == "attachment" )
      tryEmbed = false;
-#endif
+
   if ( KonqMainWindow::isMimeTypeAssociatedWithSelf( mimeType ) )
       m_req.forceAutoEmbed = true;
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic