Landing fix for bug 299054. Adding support for exposing HTTP header and status info to plugins. Patch by dmeketa@macromedia.com, r=josh@mozilla.com, sr=jst@mozilla.com, a=dveditz@cruzio.com

git-svn-id: svn://10.0.0.236/branches/MOZILLA_1_8_0_BRANCH@224186 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jst%mozilla.org
2007-04-05 00:23:39 +00:00
parent ff18150ba3
commit 7a33bba52c
5 changed files with 115 additions and 13 deletions

View File

@@ -37,7 +37,7 @@
/*
* npapi.h $Revision: 3.40.4.1 $
* npapi.h $Revision: 3.40.4.1.4.1 $
* Netscape client plug-in API spec
*/
@@ -125,7 +125,7 @@
/*----------------------------------------------------------------------*/
#define NP_VERSION_MAJOR 0
#define NP_VERSION_MINOR 16
#define NP_VERSION_MINOR 17
/* The OS/2 version of Netscape uses RC_DATA to define the
@@ -255,6 +255,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;
@@ -614,13 +624,17 @@ enum NPEventType {
/*
* Version feature information
*/
#define NPVERS_HAS_STREAMOUTPUT 8
#define NPVERS_HAS_NOTIFICATION 9
#define NPVERS_HAS_LIVECONNECT 9
#define NPVERS_WIN16_HAS_LIVECONNECT 9
#define NPVERS_68K_HAS_LIVECONNECT 11
#define NPVERS_HAS_WINDOWLESS 11
#define NPVERS_HAS_XPCONNECT_SCRIPTING 13
#define NPVERS_HAS_STREAMOUTPUT 8
#define NPVERS_HAS_NOTIFICATION 9
#define NPVERS_HAS_LIVECONNECT 9
#define NPVERS_WIN16_HAS_LIVECONNECT 9
#define NPVERS_68K_HAS_LIVECONNECT 11
#define NPVERS_HAS_WINDOWLESS 11
#define NPVERS_HAS_XPCONNECT_SCRIPTING 13
#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
/*----------------------------------------------------------------------*/
/* Function Prototypes */

View File

@@ -60,3 +60,14 @@ interface nsIHTTPHeaderListener : nsISupports
*/
void newResponseHeader(in string headerName, in string headerValue);
};
[scriptable, uuid(cf44a295-7310-4330-84c6-600039a155ef)]
interface nsIHTTPHeaderListener_MOZILLA_1_8_BRANCH : nsIHTTPHeaderListener
{
/**
* Called once for the HTTP Response status line.
* Value does NOT include a terminating newline.
* NOTE: You must copy this value.
*/
void statusLine(in string line);
};

View File

@@ -87,8 +87,9 @@ static NS_DEFINE_IID(kIPluginStreamListenerIID, NS_IPLUGINSTREAMLISTENER_IID);
///////////////////////////////////////////////////////////////////////////////
// ns4xPluginStreamListener Methods
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
nsITimerCallback)
NS_IMPL_ISUPPORTS4(ns4xPluginStreamListener, nsIPluginStreamListener,
nsITimerCallback, nsIHTTPHeaderListener,
nsIHTTPHeaderListener_MOZILLA_1_8_BRANCH)
///////////////////////////////////////////////////////////////////////////////
@@ -105,7 +106,8 @@ ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
mStreamStarted(PR_FALSE),
mStreamCleanedUp(PR_FALSE),
mCallNotify(PR_FALSE),
mIsSuspended(PR_FALSE)
mIsSuspended(PR_FALSE),
mResponseHeaderBuf(nsnull)
{
// Initialize the 4.x interface structure
memset(&mNPStream, 0, sizeof(mNPStream));
@@ -152,6 +154,9 @@ ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
if (mNotifyURL)
PL_strfree(mNotifyURL);
if (mResponseHeaderBuf)
PL_strfree(mResponseHeaderBuf);
}
///////////////////////////////////////////////////////////////////////////////
@@ -268,6 +273,11 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
pluginInfo->IsSeekable(&seekable);
pluginInfo->GetContentType(&contentType);
if (!mResponseHeaders.IsEmpty()) {
mResponseHeaderBuf = PL_strdup(mResponseHeaders.get());
mNPStream.headers = mResponseHeaderBuf;
}
mStreamInfo = pluginInfo;
@@ -753,6 +763,27 @@ ns4xPluginStreamListener::Notify(nsITimer *aTimer)
return NS_OK;
}
///////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP
ns4xPluginStreamListener::StatusLine(const char* line)
{
mResponseHeaders.Append(line);
mResponseHeaders.Append('\n');
return NS_OK;
}
///////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP
ns4xPluginStreamListener::NewResponseHeader(const char* headerName,
const char* headerValue)
{
mResponseHeaders.Append(headerName);
mResponseHeaders.Append(": ");
mResponseHeaders.Append(headerValue);
mResponseHeaders.Append('\n');
return NS_OK;
}
///////////////////////////////////////////////////////////////////////////////
nsInstanceStream::nsInstanceStream()
{

View File

@@ -40,6 +40,7 @@
#include "nsIPluginStreamListener.h"
#include "nsIPluginStreamInfo.h"
#include "nsIHTTPHeaderListener.h"
#include "nsIRequest.h"
#include "nsITimer.h"
#include "nsCOMPtr.h"
@@ -50,7 +51,8 @@ class ns4xPluginInstance;
class nsI4xPluginStreamInfo;
class ns4xPluginStreamListener : public nsIPluginStreamListener,
public nsITimerCallback
public nsITimerCallback,
public nsIHTTPHeaderListener_MOZILLA_1_8_BRANCH
{
public:
NS_DECL_ISUPPORTS
@@ -66,6 +68,10 @@ public:
NS_DECL_NSITIMERCALLBACK
// from nsIHTTPHeaderListener:
NS_IMETHOD StatusLine(const char* line);
NS_IMETHOD NewResponseHeader(const char* headerName, const char* headerValue);
// ns4xPluginStreamListener specific methods:
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData,
const char* aURL);
@@ -95,6 +101,8 @@ protected:
PRPackedBool mStreamCleanedUp;
PRPackedBool mCallNotify;
PRPackedBool mIsSuspended;
nsCString mResponseHeaders;
char* mResponseHeaderBuf;
nsCOMPtr<nsITimer> mDataPumpTimer;

View File

@@ -61,6 +61,7 @@
#include "nsIObserverService.h"
#include "nsIHttpProtocolHandler.h"
#include "nsIHttpChannel.h"
#include "nsIHttpChannelInternal.h"
#include "nsIUploadChannel.h"
#include "nsIByteRangeRequest.h"
#include "nsIStreamListener.h"
@@ -87,6 +88,7 @@
#include "nsObsoleteModuleLoading.h"
#include "nsIComponentRegistrar.h"
#include "nsPluginLogging.h"
#include "nsPrintfCString.h"
// Friggin' X11 has to "#define None". Lame!
#ifdef None
@@ -2407,6 +2409,42 @@ nsresult nsPluginStreamListenerPeer::SetUpStreamListener(nsIRequest *request,
* called, all the headers have been read.
*/
if (httpChannel) {
// Reassemble the HTTP response status line and provide it to our
// listener. Would be nice if we could get the raw status line,
// but nsIHttpChannel doesn't currently provide that.
nsCOMPtr<nsIHTTPHeaderListener_MOZILLA_1_8_BRANCH> listener =
do_QueryInterface(mPStreamListener);
if (listener) {
// Status code: required; the status line isn't useful without it.
PRUint32 statusNum;
if (NS_SUCCEEDED(httpChannel->GetResponseStatus(&statusNum)) &&
statusNum < 1000) {
// HTTP version: provide if available. Defaults to empty string.
nsCString ver;
nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal =
do_QueryInterface(channel);
if (httpChannelInternal) {
PRUint32 major, minor;
if (NS_SUCCEEDED(httpChannelInternal->GetResponseVersion(&major,
&minor))) {
ver = nsPrintfCString("/%lu.%lu", major, minor);
}
}
// Status text: provide if available. Defaults to "OK".
nsCString statusText;
if (!NS_SUCCEEDED(httpChannel->GetResponseStatusText(statusText))) {
statusText = "OK";
}
// Assemble everything and pass to listener.
nsPrintfCString status(100, "HTTP%s %lu %s", ver.get(), statusNum,
statusText.get());
listener->StatusLine(status.get());
}
}
// Also provide all HTTP response headers to our listener.
httpChannel->VisitResponseHeaders(this);
PRBool bSeekable = PR_FALSE;