[cpp-sp] branch master updated: SSPCPP-593 - Unable to clear/overwrite response headers
Scott Cantor
cantor.2 at osu.edu
Mon Mar 26 13:38:22 EDT 2018
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch master
in repository cpp-sp.
View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=fe5cd78163a74563a895ea4b7fd4dd897199cfac
The following commit(s) were added to refs/heads/master by this push:
new fe5cd78 SSPCPP-593 - Unable to clear/overwrite response headers
fe5cd78 is described below
commit fe5cd78163a74563a895ea4b7fd4dd897199cfac
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Mar 26 13:37:53 2018 -0400
SSPCPP-593 - Unable to clear/overwrite response headers
https://issues.shibboleth.net/jira/browse/SSPCPP-593
---
apache/mod_shib.cpp | 24 ++++++++++++++++++------
fastcgi/shibauthorizer.cpp | 12 ++++++------
fastcgi/shibresponder.cpp | 14 +++++++-------
iis7_shib/IIS7Request.cpp | 8 ++++----
iis7_shib/headers/IIS7Request.hpp | 2 +-
isapi_shib/isapi_shib.cpp | 30 +++++++++++++++---------------
nsapi_shib/nsapi_shib.cpp | 11 +++++++----
shibsp/handler/impl/RemotedHandler.cpp | 21 +++++++++++++++++----
8 files changed, 75 insertions(+), 47 deletions(-)
diff --git a/apache/mod_shib.cpp b/apache/mod_shib.cpp
index 0a1fd16..fac5fd3 100644
--- a/apache/mod_shib.cpp
+++ b/apache/mod_shib.cpp
@@ -648,9 +648,9 @@ public:
void setContentType(const char* type) {
m_req->content_type = ap_psprintf(m_req->pool, "%s", type);
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
+ void setResponseHeader(const char* name, const char* value, bool replace=false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
#ifdef SHIB_DEFERRED_HEADERS
if (!m_rc) {
// this happens on subrequests
@@ -660,11 +660,23 @@ public:
if (!m_rc->hdr_out) {
m_rc->hdr_out = ap_make_table(m_req->pool, 5);
}
- ap_table_add(m_rc->hdr_out, name, value);
+ if (replace || !value)
+ ap_table_unset(m_rc->hdr_out, name);
+ if (value && *value)
+ ap_table_add(m_rc->hdr_out, name, value);
}
- else
-#endif
+ else {
+ if (replace || !value)
+ ap_table_unset(m_req->err_headers_out, name);
+ if (value && *value)
+ ap_table_add(m_req->err_headers_out, name, value);
+ }
+#else
+ if (replace || !value)
+ ap_table_unset(m_req->err_headers_out, name);
+ if (value && *value)
ap_table_add(m_req->err_headers_out, name, value);
+#endif
}
}
long sendResponse(istream& in, long status) {
diff --git a/fastcgi/shibauthorizer.cpp b/fastcgi/shibauthorizer.cpp
index 76d4a27..ba0bbfe 100644
--- a/fastcgi/shibauthorizer.cpp
+++ b/fastcgi/shibauthorizer.cpp
@@ -196,14 +196,14 @@ public:
}
return "";
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
+ void setResponseHeader(const char* name, const char* value, bool replace=false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
// Set for later.
- if (value)
- m_response_headers.insert(make_pair(name,value));
- else
+ if (replace || !value)
m_response_headers.erase(name);
+ if (value && *value)
+ m_response_headers.insert(make_pair(name,value));
}
}
const char* getQueryString() const {
diff --git a/fastcgi/shibresponder.cpp b/fastcgi/shibresponder.cpp
index 32afe8e..963d4c6 100644
--- a/fastcgi/shibresponder.cpp
+++ b/fastcgi/shibresponder.cpp
@@ -148,14 +148,14 @@ public:
return s ? s : "";
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
+ void setResponseHeader(const char* name, const char* value, bool replace = false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
// Set for later.
- if (value)
- m_headers.insert(make_pair(name,value));
- else
- m_headers.erase(name);
+ if (replace || !value)
+ m_response_headers.erase(name);
+ if (value && *value)
+ m_response_headers.insert(make_pair(name, value));
}
}
diff --git a/iis7_shib/IIS7Request.cpp b/iis7_shib/IIS7Request.cpp
index a45203f..7da0be7 100644
--- a/iis7_shib/IIS7Request.cpp
+++ b/iis7_shib/IIS7Request.cpp
@@ -427,11 +427,11 @@ long IIS7Request::sendResponse(istream& in, long status)
}
// XMLTooing:: HTTPResponse
-void IIS7Request::setResponseHeader(const char* name, const char* value)
+void IIS7Request::setResponseHeader(const char* name, const char* value, bool replace)
{
- HTTPResponse::setResponseHeader(name, value);
+ HTTPResponse::setResponseHeader(name, value, replace);
- size_t sz = strlen(value);
+ size_t sz = value ? strlen(value) : 0;
if (sz > USHRT_MAX) {
// TODO Do this elsewhere?
@@ -439,7 +439,7 @@ void IIS7Request::setResponseHeader(const char* name, const char* value)
sz = USHRT_MAX;
}
- HRESULT hr = m_response->SetHeader(name, value, static_cast<USHORT>(sz), FALSE);
+ HRESULT hr = m_response->SetHeader(name, value, static_cast<USHORT>(sz), replace || !value ? TRUE : FALSE);
if (FAILED(hr)) {
throwError("setResponseHeader", hr);
}
diff --git a/iis7_shib/headers/IIS7Request.hpp b/iis7_shib/headers/IIS7Request.hpp
index 310e3d2..8f171e8 100644
--- a/iis7_shib/headers/IIS7Request.hpp
+++ b/iis7_shib/headers/IIS7Request.hpp
@@ -79,7 +79,7 @@ protected:
// XMLTooing:: HTTPResponse, GenericResponse
long sendResponse(istream& in, long status);
- void setResponseHeader(const char* name, const char* value);
+ void setResponseHeader(const char* name, const char* value, bool replace=false);
long sendRedirect(const char* url);
private:
diff --git a/isapi_shib/isapi_shib.cpp b/isapi_shib/isapi_shib.cpp
index ccf458b..6393830 100644
--- a/isapi_shib/isapi_shib.cpp
+++ b/isapi_shib/isapi_shib.cpp
@@ -519,14 +519,14 @@ public:
string getRemoteUser() const {
return getSecureHeader("remote-user");
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
+ void setResponseHeader(const char* name, const char* value, bool replace=false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
// Set for later.
- if (value)
- m_headers.insert(make_pair(name,value));
- else
+ if (replace || !value)
m_headers.erase(name);
+ if (value && *value)
+ m_headers.insert(make_pair(name,value));
}
}
long sendResponse(istream& in, long status) {
@@ -895,15 +895,15 @@ public:
GetServerVariable(const_cast<char*>(hdr.c_str()), buf, 128, false);
return buf.empty() ? "" : buf;
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
- // Set for later.
- if (value)
- m_headers.insert(make_pair(name,value));
- else
- m_headers.erase(name);
- }
+ void setResponseHeader(const char* name, const char* value, bool replace = false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
+ // Set for later.
+ if (replace || !value)
+ m_headers.erase(name);
+ if (value && *value)
+ m_headers.insert(make_pair(name, value));
+ }
}
const char* getQueryString() const {
return m_lpECB->lpszQueryString;
diff --git a/nsapi_shib/nsapi_shib.cpp b/nsapi_shib/nsapi_shib.cpp
index b07cb01..7ada5f1 100644
--- a/nsapi_shib/nsapi_shib.cpp
+++ b/nsapi_shib/nsapi_shib.cpp
@@ -425,10 +425,13 @@ public:
param_free(pblock_remove("content-type", m_rq->srvhdrs));
setResponseHeader("Content-Type", type);
}
- void setResponseHeader(const char* name, const char* value) {
- HTTPResponse::setResponseHeader(name, value);
- if (name) {
- pblock_nvinsert(name, value, m_rq->srvhdrs);
+ void setResponseHeader(const char* name, const char* value, bool replace=false) {
+ HTTPResponse::setResponseHeader(name, value, replace);
+ if (name && *name) {
+ if (replace || !value)
+ param_free(pblock_remove(name, m_rq->srvhdrs));
+ if (value && *value)
+ pblock_nvinsert(name, value, m_rq->srvhdrs);
}
}
diff --git a/shibsp/handler/impl/RemotedHandler.cpp b/shibsp/handler/impl/RemotedHandler.cpp
index cc4e96c..21bb01e 100644
--- a/shibsp/handler/impl/RemotedHandler.cpp
+++ b/shibsp/handler/impl/RemotedHandler.cpp
@@ -166,7 +166,7 @@ namespace shibsp {
long sendResponse(std::istream& inputStream, long status);
// HTTPResponse
- void setResponseHeader(const char* name, const char* value);
+ void setResponseHeader(const char* name, const char* value, bool replace=false);
long sendRedirect(const char* url);
};
}
@@ -294,15 +294,28 @@ long RemotedResponse::sendResponse(std::istream& in, long status)
return status;
}
-void RemotedResponse::setResponseHeader(const char* name, const char* value)
+void RemotedResponse::setResponseHeader(const char* name, const char* value, bool replace)
{
+ HTTPResponse::setResponseHeader(name, value, replace);
+
if (!m_output.isstruct())
m_output.structure();
DDF hdrs = m_output["headers"];
if (hdrs.isnull())
hdrs = m_output.addmember("headers").list();
- DDF h = DDF(name).string(value);
- hdrs.add(h);
+ if (replace || !value) {
+ DDF hdr = hdrs.first();
+ while (!hdr.isnull()) {
+ if (hdr.name() && !strcmp(hdr.name(), name))
+ hdr.destroy();
+ hdr = hdrs.next();
+ }
+ }
+
+ if (value && *value) {
+ DDF h = DDF(name).string(value);
+ hdrs.add(h);
+ }
}
long RemotedResponse::sendRedirect(const char* url)
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list