Skip to content

GET of Group Settings doesn´t work: response is XML instead of JSON #6671

@Conjacq

Description

@Conjacq

The GET request of the Group Setting API returns XML, but the google-api-php-client-services expects JSON. It returns an empty Google\Service\Groupssettings class.

Environment details

  • PHP version: 8.3.6

Composer packages:

  • google/apiclient v2.18.3
  • google/apiclient-services v0.397.0

Steps to reproduce

  1. Use the GET function of \Google\Service\Groupssettings
  2. The result will be an empty \Google\Service\Groupssettings class

Workaround

The PATCH request will return a JSON response and that works without a problem. It is possible to alter 1 deprecated setting via the PATCH request and all the current settings will be returned.

JSON decode in the REST class

The REST class is decoding the response and expects JSON:

    /**
     * Decode an HTTP Response.
     * @static
     *
     * @template T
     * @param RequestInterface $response The http response to be decoded.
     * @param ResponseInterface $response
     * @param class-string<T>|false|null $expectedClass
     * @return mixed|T|null
     * @throws \Google\Service\Exception
     */
    public static function decodeHttpResponse(
        ResponseInterface $response,
        ?RequestInterface $request = null,
        $expectedClass = null
    ) {
        $code = $response->getStatusCode();

        // retry strategy
        if (intVal($code) >= 400) {
            // if we errored out, it should be safe to grab the response body
            $body = (string)$response->getBody();

            // Check if we received errors, and add those to the Exception for convenience
            throw new GoogleServiceException($body, $code, null, self::getResponseErrors($body));
        }

        // Ensure we only pull the entire body into memory if the request is not
        // of media type
        $body = self::decodeBody($response, $request);

        if ($expectedClass = self::determineExpectedClass($expectedClass, $request)) {
            $json = json_decode($body, true);

            return new $expectedClass($json);
        }

        return $response;
    }

XML return of the GET request

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" xmlns:apps="http://schemas.google.com/apps/2006">
    <id>tag:googleapis.com,2010:apps:groupssettings:GROUP:[email protected]</id>
    <title>Groups Resource Entry</title>
    <content type="text">Example</content>
    <author>
        <name>Google</name>
    </author>
    <apps:email>[email protected]</apps:email>
    <apps:name>Example</apps:name>
    <apps:description>Example</apps:description>
    <apps:whoCanJoin>CAN_REQUEST_TO_JOIN</apps:whoCanJoin>
    <apps:whoCanViewMembership>ALL_IN_DOMAIN_CAN_VIEW</apps:whoCanViewMembership>
    <apps:whoCanViewGroup>ALL_MEMBERS_CAN_VIEW</apps:whoCanViewGroup>
    <apps:whoCanInvite>ALL_MANAGERS_CAN_INVITE</apps:whoCanInvite>
    <apps:whoCanAdd>ALL_MANAGERS_CAN_ADD</apps:whoCanAdd>
    <apps:allowExternalMembers>true</apps:allowExternalMembers>
    <apps:whoCanPostMessage>ALL_IN_DOMAIN_CAN_POST</apps:whoCanPostMessage>
    <apps:allowWebPosting>true</apps:allowWebPosting>
    <apps:primaryLanguage>en</apps:primaryLanguage>
    <apps:maxMessageBytes>26214400</apps:maxMessageBytes>
    <apps:isArchived>true</apps:isArchived>
    <apps:archiveOnly>false</apps:archiveOnly>
    <apps:messageModerationLevel>MODERATE_NON_MEMBERS</apps:messageModerationLevel>
    <apps:spamModerationLevel>MODERATE</apps:spamModerationLevel>
    <apps:replyTo>REPLY_TO_SENDER</apps:replyTo>
    <apps:includeCustomFooter>false</apps:includeCustomFooter>
    <apps:customFooterText></apps:customFooterText>
    <apps:sendMessageDenyNotification>true</apps:sendMessageDenyNotification>
    <apps:defaultMessageDenyNotificationText></apps:defaultMessageDenyNotificationText>
    <apps:showInGroupDirectory>false</apps:showInGroupDirectory>
    <apps:allowGoogleCommunication>false</apps:allowGoogleCommunication>
    <apps:membersCanPostAsTheGroup>false</apps:membersCanPostAsTheGroup>
    <apps:defaultSender>DEFAULT_SELF</apps:defaultSender>
    <apps:messageDisplayFont>DEFAULT_FONT</apps:messageDisplayFont>
    <apps:includeInGlobalAddressList>true</apps:includeInGlobalAddressList>
    <apps:whoCanLeaveGroup>ALL_MEMBERS_CAN_LEAVE</apps:whoCanLeaveGroup>
    <apps:whoCanContactOwner>ALL_IN_DOMAIN_CAN_CONTACT</apps:whoCanContactOwner>
    <apps:whoCanAddReferences>NONE</apps:whoCanAddReferences>
    <apps:whoCanAssignTopics>OWNERS_AND_MANAGERS</apps:whoCanAssignTopics>
    <apps:whoCanUnassignTopic>OWNERS_AND_MANAGERS</apps:whoCanUnassignTopic>
    <apps:whoCanTakeTopics>OWNERS_AND_MANAGERS</apps:whoCanTakeTopics>
    <apps:whoCanMarkDuplicate>OWNERS_AND_MANAGERS</apps:whoCanMarkDuplicate>
    <apps:whoCanMarkNoResponseNeeded>OWNERS_AND_MANAGERS</apps:whoCanMarkNoResponseNeeded>
    <apps:whoCanMarkFavoriteReplyOnAnyTopic>OWNERS_AND_MANAGERS</apps:whoCanMarkFavoriteReplyOnAnyTopic>
    <apps:whoCanMarkFavoriteReplyOnOwnTopic>OWNERS_AND_MANAGERS</apps:whoCanMarkFavoriteReplyOnOwnTopic>
    <apps:whoCanUnmarkFavoriteReplyOnAnyTopic>OWNERS_AND_MANAGERS</apps:whoCanUnmarkFavoriteReplyOnAnyTopic>
    <apps:whoCanEnterFreeFormTags>OWNERS_AND_MANAGERS</apps:whoCanEnterFreeFormTags>
    <apps:whoCanModifyTagsAndCategories>OWNERS_AND_MANAGERS</apps:whoCanModifyTagsAndCategories>
    <apps:favoriteRepliesOnTop>true</apps:favoriteRepliesOnTop>
    <apps:whoCanApproveMembers>ALL_MANAGERS_CAN_APPROVE</apps:whoCanApproveMembers>
    <apps:whoCanBanUsers>OWNERS_AND_MANAGERS</apps:whoCanBanUsers>
    <apps:whoCanModifyMembers>OWNERS_AND_MANAGERS</apps:whoCanModifyMembers>
    <apps:whoCanApproveMessages>OWNERS_AND_MANAGERS</apps:whoCanApproveMessages>
    <apps:whoCanDeleteAnyPost>OWNERS_AND_MANAGERS</apps:whoCanDeleteAnyPost>
    <apps:whoCanDeleteTopics>OWNERS_AND_MANAGERS</apps:whoCanDeleteTopics>
    <apps:whoCanLockTopics>OWNERS_AND_MANAGERS</apps:whoCanLockTopics>
    <apps:whoCanMoveTopicsIn>OWNERS_AND_MANAGERS</apps:whoCanMoveTopicsIn>
    <apps:whoCanMoveTopicsOut>OWNERS_AND_MANAGERS</apps:whoCanMoveTopicsOut>
    <apps:whoCanPostAnnouncements>OWNERS_AND_MANAGERS</apps:whoCanPostAnnouncements>
    <apps:whoCanHideAbuse>OWNERS_AND_MANAGERS</apps:whoCanHideAbuse>
    <apps:whoCanMakeTopicsSticky>OWNERS_AND_MANAGERS</apps:whoCanMakeTopicsSticky>
    <apps:whoCanModerateMembers>OWNERS_AND_MANAGERS</apps:whoCanModerateMembers>
    <apps:whoCanModerateContent>OWNERS_AND_MANAGERS</apps:whoCanModerateContent>
    <apps:whoCanAssistContent>OWNERS_AND_MANAGERS</apps:whoCanAssistContent>
    <apps:customRolesEnabledForSettingsToBeMerged>false</apps:customRolesEnabledForSettingsToBeMerged>
    <apps:enableCollaborativeInbox>false</apps:enableCollaborativeInbox>
    <apps:whoCanDiscoverGroup>ALL_IN_DOMAIN_CAN_DISCOVER</apps:whoCanDiscoverGroup>
</entry>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions