Skip to content

Add missing REST methods to Curl Client (SwiftOtter's SOP-348) #39330

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

Conversation

lbajsarowicz
Copy link
Contributor

@lbajsarowicz lbajsarowicz commented Nov 5, 2024

Description (*)

There are 9 methods in the HTTP protocol (https://en.wikipedia.org/wiki/HTTP).
Magento implements just 2 of them, so when you need to make requests to remote environments using Framework HTTP Client, you end up with HTTP 411 error.

This Pull Request adds missing methods with their payload support:

  • PUT
  • PATCH
  • DELETE

Related Pull Requests

Fixed Issues (if relevant)

  1. Fixes magento/magento2#<issue_number>

Manual testing scenarios (*)

  1. ...
  2. ...

Questions or comments

Contribution checklist (*)

  • Pull request has a meaningful description of its purpose
  • All commits are accompanied by meaningful commit messages
  • All new or changed code is covered with unit/integration tests (if applicable)
  • README.md files for modified modules are updated and included in the pull request if any README.md predefined sections require an update
  • All automated tests passed successfully (all builds are green)

Resolved issues:

  1. resolves [Issue] Add missing REST methods to Curl Client (SwiftOtter's SOP-348) #39341: Add missing REST methods to Curl Client (SwiftOtter's SOP-348)

Copy link

m2-assistant bot commented Nov 5, 2024

Hi @lbajsarowicz. Thank you for your contribution!
Here are some useful tips on how you can test your changes using Magento test environment.
❗ Automated tests can be triggered manually with an appropriate comment:

  • @magento run all tests - run or re-run all required tests against the PR changes
  • @magento run <test-build(s)> - run or re-run specific test build(s)
    For example: @magento run Unit Tests

<test-build(s)> is a comma-separated list of build names.

Allowed build names are:
  1. Database Compare
  2. Functional Tests CE
  3. Functional Tests EE
  4. Functional Tests B2B
  5. Integration Tests
  6. Magento Health Index
  7. Sample Data Tests CE
  8. Sample Data Tests EE
  9. Sample Data Tests B2B
  10. Static Tests
  11. Unit Tests
  12. WebAPI Tests
  13. Semantic Version Checker

You can find more information about the builds here
ℹ️ Run only required test builds during development. Run all test builds before sending your pull request for review.


For more details, review the Code Contributions documentation.
Join Magento Community Engineering Slack and ask your questions in #github channel.

@lbajsarowicz
Copy link
Contributor Author

@magento run all tests

@lbajsarowicz lbajsarowicz changed the title SwiftOtter-SOP-348 Add missing REST methods to Curl Client Add missing REST methods to Curl Client (SwiftOtter's SOP-348) Nov 5, 2024
Copy link
Contributor

@michalbiarda michalbiarda left a comment

Choose a reason for hiding this comment

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

I added a few comments with possible improvements. Also, I think you forgot to add CONNECT method.

* @param string $uri
* @return void
*/
public function delete($uri)
Copy link
Contributor

Choose a reason for hiding this comment

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

According to HTTP documentation, DELETE request can include optional payload.

* @param string $uri
* @return void
*/
public function options($uri)
Copy link
Contributor

Choose a reason for hiding this comment

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

According to HTTP documentation, OPTIONS request can include optional payload.

* @param string $uri
* @return void
*/
public function head($uri)
Copy link
Contributor

Choose a reason for hiding this comment

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

According to HTTP documentation, HEAD request can include optional payload.

@lbajsarowicz
Copy link
Contributor Author

@ihor-sviziev or @bgorski Can I ask you for Code Review in this specific case?

@engcom-Hotel engcom-Hotel added Triage: Dev.Experience Issue related to Developer Experience and needs help with Triage to Confirm or Reject it Priority: P3 May be fixed according to the position in the backlog. labels Nov 7, 2024
@engcom-Hotel
Copy link
Contributor

@magento create issue

@engcom-Hotel
Copy link
Contributor

@magento run all tests

@engcom-Hotel engcom-Hotel self-requested a review November 18, 2024 08:18
Copy link
Contributor

@engcom-Hotel engcom-Hotel left a comment

Choose a reason for hiding this comment

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

Hello @lbajsarowicz,

Thanks for the contribution!

It seems this PR has been already reviewed by @michalbiarda. We request you to please address them and also please fix the failed automated tests.

Thanks

@engcom-Dash
Copy link
Contributor

@magento run all tests

@engcom-Dash
Copy link
Contributor

I added a few comments with possible improvements. Also, I think you forgot to add CONNECT method.

@michalbiarda @engcom-Hotel: I have added an optional payload for the DELETE, OPTIONS, and HEAD methods. Additionally, I added the CONNECT method. Please review it. Thanks.

cc: @lbajsarowicz

@engcom-Dash
Copy link
Contributor

@magento run all tests

@engcom-Hotel
Copy link
Contributor

@magento run Functional Tests B2B, Functional Tests CE

Copy link
Contributor

@engcom-Hotel engcom-Hotel left a comment

Choose a reason for hiding this comment

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

Hello @lbajsarowicz @engcom-Dash,

Please refer to the below review comments.

Thanks

declare(strict_types=1);

namespace Magento\TestFramework\Helper;

use Magento\Framework\HTTP\Client\Curl;
Copy link
Contributor

Choose a reason for hiding this comment

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

In line no. 53:

$this->curl = new Curl();

I suggest you add the parameter $curl as null and use ObjectManager to initialize it. Please refer to the $this->deploymentConfig

@@ -1,30 +0,0 @@
<?php
Copy link
Contributor

Choose a reason for hiding this comment

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

It is not recommended to delete the existing file, as other third-party extensions might use it. Instead, mark it as deprecated.

Thanks

* @param array|string $params
* @return void
*/
public function head(string $uri, array|string $params = [])
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I did not introduce a payload here because according to RFC9110

The HEAD method is identical to GET except that the server MUST NOT send content in the response.

https://www.rfc-editor.org/rfc/rfc9110.html#section-9.3.2


You're absolutely correct that the RFC you linked doesn't explicitly forbid a payload for HEAD requests. However, it strongly discourages it and hints at the reasons why it's generally not used:

Semantic Ambiguity:

  • HEAD is for metadata: The core purpose of HEAD is to fetch metadata about a resource without retrieving the actual data. A payload in this context has no clearly defined meaning. What should the server do with the provided data? Unlike POST (create/update) or PUT (replace), HEAD doesn't have an inherent action associated with a payload.

  • Potential for Confusion: Including a payload with HEAD could lead to confusion and unpredictable behavior, as servers might interpret it in different ways. This ambiguity undermines the standardization that HTTP strives for.

Why GET can have a payload (though discouraged):

While GET requests can technically have a payload, it's generally discouraged for similar reasons to HEAD. The RFC states that a payload in a GET request "has no semantic meaning to the request." This means the server is free to ignore it.

Copy link
Contributor

Choose a reason for hiding this comment

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

Hello @lbajsarowicz,

Thanks for the detailed explanation.

FYI, as mentioned in #39330 (review), I have added an optional payload for the DELETE, OPTIONS, and HEAD methods. Additionally, I have added the CONNECT method with an optional payload. If possible, could you please revert these changes, or let me know which methods, including HEAD, do not require an optional payload? Your input would be greatly appreciated.

Thanks again!

@lbajsarowicz
Copy link
Contributor Author

Regarding CONNECT

The CONNECT method requests that the recipient establish a tunnel to the destination origin server identified by the request-target and, if successful, that the recipient send a 2xx (Successful) response. The request MUST NOT include a message body.

https://www.rfc-editor.org/rfc/rfc9110.html#section-9.3.6

@lbajsarowicz
Copy link
Contributor Author

@magento run all tests

@engcom-Dash
Copy link
Contributor

Hi @lbajsarowicz,

Thank you for your contribution!

We are currently in discussions with the Product Owner regarding this PR, as the issue has been tagged as a feature request in #39341 (comment). Once we receive input, we will review it. In the meantime, we are moving it to "On Hold."

Thank you!

@engcom-Dash
Copy link
Contributor

Hello @lbajsarowicz,

We have received a response from the PO, indicating that this class is used in many extensions, and the changes provided in the pull request are backward incompatible, which is considered a breaking change. This could disrupt extensions.

Given these implications, it seems best not to proceed with this PR.

However, we sincerely appreciate your valuable contributions.

Thanks

@lbajsarowicz
Copy link
Contributor Author

@engcom-Dash are you able to provide more information what is considered as backwards-incompatible?

@jakwinkler
Copy link

@engcom-Dash these changes are backwards-compatible

@lbajsarowicz
Copy link
Contributor Author

I disagree with your decision and - as a response to it - I created two separate PRs to address the complain about backwards compatibility.

See referenced PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Priority: P3 May be fixed according to the position in the backlog. Project: Community Picked PRs upvoted by the community Triage: Dev.Experience Issue related to Developer Experience and needs help with Triage to Confirm or Reject it
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Issue] Add missing REST methods to Curl Client (SwiftOtter's SOP-348)
6 participants