[
https://issues.apache.org/jira/browse/HTTPCLIENT-1916?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jorge Moraleda updated HTTPCLIENT-1916:
---------------------------------------
Description:
It would be convenient to have a *removeParameter* method added to class
*URIBuilder*.
One rationale for this proposal is the use case when of reusing an *URIBuilder*
to create multiple similar HMAC signed requests. In that scenario it is not
sufficient to invoke *setParameter* with the values of the parameters that have
changed. One also needs to remove the _signature_ parameter from the previous
request before the current request can be signed and a new _signature_
parameter added to it.
This would be the implementation of the proposed method *removeParameter*:
{code:java}
/**
* Remove parameter of URI query if set. The parameter name
* is expected to be unescaped and may contain non ASCII characters.
* <p>
* Please note query parameters and custom query component are mutually
exclusive. This method
* will remove custom query if present.
* </p>
*/
public URIBuilder removeParameter(final String param) {
if (this.queryParams == null) {
return this;
}
if (!this.queryParams.isEmpty()) {
for (final Iterator<NameValuePair> it =
this.queryParams.iterator(); it.hasNext(); ) {
final NameValuePair nvp = it.next();
if (nvp.getName().equals(param)) {
it.remove();
}
}
}
this.encodedQuery = null;
this.encodedSchemeSpecificPart = null;
this.query = null;
return this;
}
{code}
Since the proposed implementation above is the current implementation of
*setParameter* minus the one line that actually adds the new parameter, then
the implementation of *setParameter* would simplify greatly to:
{code:java}
/**
* Sets parameter of URI query overriding existing value if set. The
parameter name and value
* are expected to be unescaped and may contain non ASCII characters.
* <p>
* Please note query parameters and custom query component are mutually
exclusive. This method
* will remove custom query if present.
* </p>
*/
public URIBuilder setParameter(final String param, final String value) {
removeParameter(param);
this.queryParams.add(new BasicNameValuePair(param, value));
return this;
}
{code}
was:
It would be convenient to have a *removeParameter* method added to class
*URIBuilder*.
One rationale for this proposal is the use case when of reusing an *URIBuilder*
to create multiple similar HMAC signed requests. In that scenario it is not
sufficient to invoke *setParameter* with the values of the parameters that have
changed. One also needs to remove the _signature_ parameter from the previous
request before the current request can be signed and a new _signature_
parameter added to it.
This would be the implementation of the proposed method *removeParameter*:
{code:java}
/**
* Remove parameter of URI query if set. The parameter name
* is expected to be unescaped and may contain non ASCII characters.
* <p>
* Please note query parameters and custom query component are mutually
exclusive. This method
* will remove custom query if present.
* </p>
*/
public URIBuilder removeParameter(final String param) {
if (this.queryParams == null) {
return this;
}
if (!this.queryParams.isEmpty()) {
for (final Iterator<NameValuePair> it =
this.queryParams.iterator(); it.hasNext(); ) {
final NameValuePair nvp = it.next();
if (nvp.getName().equals(param)) {
it.remove();
}
}
}
this.encodedQuery = null;
this.encodedSchemeSpecificPart = null;
this.query = null;
return this;
}
{code}
Since the proposed implementation above is the current implementation of
*setParameter* minus the one line that actually adds the parameter, then the
implementation of *setParameter* would become:
{code:java}
/**
* Sets parameter of URI query overriding existing value if set. The
parameter name and value
* are expected to be unescaped and may contain non ASCII characters.
* <p>
* Please note query parameters and custom query component are mutually
exclusive. This method
* will remove custom query if present.
* </p>
*/
public URIBuilder setParameter(final String param, final String value) {
removeParameter(param);
this.queryParams.add(new BasicNameValuePair(param, value));
return this;
}
{code}
> Add method removeParameter to URIBuilder
> ----------------------------------------
>
> Key: HTTPCLIENT-1916
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1916
> Project: HttpComponents HttpClient
> Issue Type: New Feature
> Components: HttpClient (classic)
> Affects Versions: 4.5.5, 4.5.6, 5.0 Beta1, 5.0 Beta2
> Reporter: Jorge Moraleda
> Priority: Trivial
> Labels: features
> Original Estimate: 0.5h
> Remaining Estimate: 0.5h
>
> It would be convenient to have a *removeParameter* method added to class
> *URIBuilder*.
> One rationale for this proposal is the use case when of reusing an
> *URIBuilder* to create multiple similar HMAC signed requests. In that
> scenario it is not sufficient to invoke *setParameter* with the values of the
> parameters that have changed. One also needs to remove the _signature_
> parameter from the previous request before the current request can be signed
> and a new _signature_ parameter added to it.
> This would be the implementation of the proposed method *removeParameter*:
> {code:java}
> /**
> * Remove parameter of URI query if set. The parameter name
> * is expected to be unescaped and may contain non ASCII characters.
> * <p>
> * Please note query parameters and custom query component are mutually
> exclusive. This method
> * will remove custom query if present.
> * </p>
> */
> public URIBuilder removeParameter(final String param) {
> if (this.queryParams == null) {
> return this;
> }
> if (!this.queryParams.isEmpty()) {
> for (final Iterator<NameValuePair> it =
> this.queryParams.iterator(); it.hasNext(); ) {
> final NameValuePair nvp = it.next();
> if (nvp.getName().equals(param)) {
> it.remove();
> }
> }
> }
> this.encodedQuery = null;
> this.encodedSchemeSpecificPart = null;
> this.query = null;
> return this;
> }
> {code}
> Since the proposed implementation above is the current implementation of
> *setParameter* minus the one line that actually adds the new parameter, then
> the implementation of *setParameter* would simplify greatly to:
>
> {code:java}
> /**
> * Sets parameter of URI query overriding existing value if set. The
> parameter name and value
> * are expected to be unescaped and may contain non ASCII characters.
> * <p>
> * Please note query parameters and custom query component are mutually
> exclusive. This method
> * will remove custom query if present.
> * </p>
> */
> public URIBuilder setParameter(final String param, final String value) {
> removeParameter(param);
> this.queryParams.add(new BasicNameValuePair(param, value));
> return this;
> }
> {code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]