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:example@example.com</id>
    <title>Groups Resource Entry</title>
    <content type="text">Example</content>
    <author>
        <name>Google</name>
    </author>
    <apps:email>example@example.com</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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions