Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add custom PatchMethod class to use http PATCH requests with the Nextcloud SSO api #8818

Merged
merged 4 commits into from
Sep 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/analysis/findbugs-results.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
460
462
18 changes: 16 additions & 2 deletions src/main/java/com/nextcloud/android/sso/InputStreamBinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,20 @@ private HttpMethodBase buildMethod(NextcloudRequest request, Uri baseUri, InputS
}
break;

case "PATCH":
method = new PatchMethod(requestUrl);
if (requestBodyInputStream != null) {
RequestEntity requestEntity = new InputStreamRequestEntity(requestBodyInputStream);
((PatchMethod) method).setRequestEntity(requestEntity);
} else if (request.getRequestBody() != null) {
StringRequestEntity requestEntity = new StringRequestEntity(
request.getRequestBody(),
CONTENT_TYPE_APPLICATION_JSON,
CHARSET_UTF8);
((PatchMethod) method).setRequestEntity(requestEntity);
}
break;

case "PUT":
method = new PutMethod(requestUrl);
if (requestBodyInputStream != null) {
Expand Down Expand Up @@ -298,8 +312,8 @@ private HttpMethodBase buildMethod(NextcloudRequest request, Uri baseUri, InputS
break;

case "HEAD":
method = new HeadMethod(requestUrl);
break;
method = new HeadMethod(requestUrl);
break;

default:
throw new UnsupportedOperationException(EXCEPTION_UNSUPPORTED_METHOD);
Expand Down
118 changes: 118 additions & 0 deletions src/main/java/com/nextcloud/android/sso/PatchMethod.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/*
* Nextcloud SingleSignOn
*
* @author Timo Triebensky
* Copyright (C) 2021 Timo Triebensky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* More information here: https://github.com/abeluck/android-streams-ipc
*
* ====================================================================
*
* The required methods of this class are copied and customized from PostMethod.
*/

package com.nextcloud.android.sso;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add license header.
If this is a copy from PostMethod please also note this somewhere.

Copy link
Contributor Author

@binsky08 binsky08 Aug 6, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't had to do a lot with licenses yet. @tobiasKaminsky Do you think that's okay?
Do I need that author and copyright part?

/*
 * Nextcloud SingleSignOn
 *
 * @author Timo Triebensky
 * Copyright (C) 2021 Timo Triebensky
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * More information here: https://github.com/abeluck/android-streams-ipc
 *
 * ====================================================================
 *
 * The required methods of this class are copied and customized from PostMethod.
 */


import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.util.EncodingUtil;

import java.util.Vector;

public class PatchMethod extends PostMethod {

/**
* The buffered request body consisting of <code>NameValuePair</code>s.
*/
private Vector params = new Vector();

/**
* No-arg constructor.
*/
public PatchMethod() {
super();
}

/**
* Constructor specifying a URI.
*
* @param uri either an absolute or relative URI
*/
public PatchMethod(String uri) {
super(uri);
}

/**
* Returns <tt>"PATCH"</tt>.
*
* @return <tt>"PATCH"</tt>
* @since 2.0
*/
@Override
public String getName() {
return "PATCH";
}

/**
* Returns <tt>true</tt> if there is a request body to be sent.
*
* @return boolean
* @since 2.0beta1
*/
protected boolean hasRequestContent() {
if (!this.params.isEmpty()) {
return true;
} else {
return super.hasRequestContent();
}
}

/**
* Clears request body.
*
* @since 2.0beta1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is from c&p I assume, so please remove.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed it

*/
protected void clearRequestBody() {
this.params.clear();
super.clearRequestBody();
}

/**
* Generates a request entity from the patch parameters, if present. Calls {@link
* EntityEnclosingMethod#generateRequestBody()} if parameters have not been set.
*
* @since 3.0
*/
protected RequestEntity generateRequestEntity() {
if (!this.params.isEmpty()) {
// Use a ByteArrayRequestEntity instead of a StringRequestEntity.
// This is to avoid potential encoding issues. Form url encoded strings
// are ASCII by definition but the content type may not be. Treating the content
// as bytes allows us to keep the current charset without worrying about how
// this charset will effect the encoding of the form url encoded string.
String content = EncodingUtil.formUrlEncode(getParameters(), getRequestCharSet());
ByteArrayRequestEntity entity = new ByteArrayRequestEntity(
EncodingUtil.getAsciiBytes(content),
FORM_URL_ENCODED_CONTENT_TYPE
);
return entity;
} else {
return super.generateRequestEntity();
}
}
}