Skip to content

Update odsp driver for new header #24819

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

Merged
merged 28 commits into from
Jun 19, 2025
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
11cb41f
update the shareLink enum
MarioJGMsoft Jun 10, 2025
d51a137
feat: added non-durable redeem.
MarioJGMsoft Jun 11, 2025
9a2e061
Merge branch 'main' into ODSPHeaderNonDurableRedeem
MarioJGMsoft Jun 11, 2025
282b9b9
fix: added nondurable redeem to manual redirect
MarioJGMsoft Jun 11, 2025
91aa627
docs: changed variable name
MarioJGMsoft Jun 11, 2025
667cb44
docs: updated variable name
MarioJGMsoft Jun 11, 2025
11db37b
test: added tests and covered edge case
MarioJGMsoft Jun 11, 2025
c4686cb
feat: added all logic to a single if.
MarioJGMsoft Jun 11, 2025
1f0cb9c
fix: updated name of header variable
MarioJGMsoft Jun 12, 2025
5169eef
fix: fixed test variables
MarioJGMsoft Jun 12, 2025
ad1e6a1
test: initial test to review headers
MarioJGMsoft Jun 12, 2025
073fbf9
test-fix: Fixed.only of test
MarioJGMsoft Jun 12, 2025
f73a3c9
test: added full test
MarioJGMsoft Jun 13, 2025
57d56d7
test: added event prop
MarioJGMsoft Jun 13, 2025
fff21d2
fix: applied changes based on feedback
MarioJGMsoft Jun 13, 2025
4185ecb
Merge branch 'main' into ODSPHeaderNonDurableRedeem
MarioJGMsoft Jun 13, 2025
cd6cbeb
comments: applied changes based on comments
MarioJGMsoft Jun 17, 2025
5e427f2
Merge branch 'main' into ODSPHeaderNonDurableRedeem
MarioJGMsoft Jun 17, 2025
edc05b2
docs: updated comment
MarioJGMsoft Jun 17, 2025
e4a414d
revert: reverted unnecessary change
MarioJGMsoft Jun 17, 2025
6067787
docs: applied changes based on comments
MarioJGMsoft Jun 17, 2025
e4e01d3
Merge branch 'main' into ODSPHeaderNonDurableRedeem
MarioJGMsoft Jun 17, 2025
68181da
telemetry: added isRedemptionNonDurable in fetchLatestSnapshotCore ev…
MarioJGMsoft Jun 18, 2025
2967ca7
test: updated assert error message
MarioJGMsoft Jun 18, 2025
a12f59d
telemetry: moved isRedemptionNonDurable
MarioJGMsoft Jun 19, 2025
23b356e
test: added isRedemptionNonDurable to details variable
MarioJGMsoft Jun 19, 2025
0a0f628
Merge branch 'main' into ODSPHeaderNonDurableRedeem
MarioJGMsoft Jun 19, 2025
9230287
fix: added isRedemptionNonDurable to details and updated biome format
MarioJGMsoft Jun 19, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ export interface ShareLinkInfoType {
error?: any;
shareId?: string;
};
isNonDurableRedeem?: boolean;
sharingLinkToRedeem?: string;
}

Expand Down
5 changes: 5 additions & 0 deletions packages/drivers/odsp-driver-definitions/src/resolvedUrl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ export interface ShareLinkInfoType {
* permission then this link can be redeemed for the permissions in the same network call.
*/
sharingLinkToRedeem?: string;

/**
* If the sharing link to redeem is a non-durable link, this flag will be set to true.
*/
isNonDurableRedeem?: boolean;
}
/**
* @legacy
Expand Down
4 changes: 4 additions & 0 deletions packages/drivers/odsp-driver/src/contractsPublic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,17 @@ export enum SharingLinkHeader {
// Can be used in request made to resolver, to tell the resolver that the passed in URL is a sharing link
// which can be redeemed at server to get permissions.
isSharingLinkToRedeem = "isSharingLinkToRedeem",
// When isSharingLinkToRedeem is true, this header can be used to tell the server that the sharing link
// is a non-durable link
isNonDurableRedeem = "isNonDurableRedeem",
}

/**
* @internal
*/
export interface ISharingLinkHeader {
[SharingLinkHeader.isSharingLinkToRedeem]: boolean;
[SharingLinkHeader.isNonDurableRedeem]: boolean;
}
/**
* @internal
Expand Down
13 changes: 12 additions & 1 deletion packages/drivers/odsp-driver/src/fetchSnapshot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,9 @@ async function redeemSharingLink(
odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,
);

const isNonDurableRedeem: boolean =
odspResolvedUrl.shareLinkInfo?.isNonDurableRedeem === true;

let redeemUrl: string | undefined;
async function callSharesAPI(baseUrl: string): Promise<void> {
await getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
Expand All @@ -241,6 +244,9 @@ async function redeemSharingLink(
);
const headers = getHeadersWithAuth(authHeader);
headers.prefer = "redeemSharingLink";
if (isNonDurableRedeem) {
headers.prefer = "nonDurableRedeem";
}
await fetchAndParseAsJSONHelper(url, { headers, method });
});
}
Expand Down Expand Up @@ -724,11 +730,16 @@ export const downloadSnapshot = mockify(
const queryString = getQueryString(queryParams);
const url = `${snapshotUrl}/trees/latest${queryString}`;
const method = "POST";
const isNonDurableRedeem: boolean =
odspResolvedUrl.shareLinkInfo?.isNonDurableRedeem === true;
// The location of file can move on Spo in which case server returns 308(Permanent Redirect) error.
// Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.
// This error thrown by server will contain the new redirect location. Look at the 404 error parsing
// for further reference here: \packages\utils\odsp-doclib-utils\src\odspErrorUtils.ts
const header = { prefer: "manualredirect" };
// If the share link is non-durable, we will add the nonDurableRedeem header to the header.prefer.
const header = isNonDurableRedeem
? { prefer: "manualredirect, nonDurableRedeem" }
: { prefer: "manualredirect" };
const authHeader = await getAuthHeader(
{ ...tokenFetchOptions, request: { url, method } },
"downloadSnapshot",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ export class OdspDriverUrlResolverForShareLink implements IUrlResolver {
const requestToBeResolved = { headers: request.headers, url: request.url };
const isSharingLinkToRedeem =
requestToBeResolved.headers?.[SharingLinkHeader.isSharingLinkToRedeem];
const isNonDurableRedeem =
requestToBeResolved.headers?.[SharingLinkHeader.isNonDurableRedeem];
try {
const url = new URL(request.url);

Expand Down Expand Up @@ -168,6 +170,11 @@ export class OdspDriverUrlResolverForShareLink implements IUrlResolver {
odspResolvedUrl.shareLinkInfo = Object.assign(odspResolvedUrl.shareLinkInfo ?? {}, {
sharingLinkToRedeem: this.removeNavParam(request.url),
});
if (isNonDurableRedeem) {
odspResolvedUrl.shareLinkInfo = Object.assign(odspResolvedUrl.shareLinkInfo ?? {}, {
isNonDurableRedeem: true,
});
}
}
if (odspResolvedUrl.itemId) {
// Kick start the sharing link request if we don't have it already as a performance optimization.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,41 @@ describe("Tests for OdspDriverUrlResolverForShareLink resolver", () => {
);
});

it("isNonDurableRedeem should be set when isNonDurableRedeem header is set", async () => {
const url = new URL(sharelink);
const resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {
storeLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });
return urlResolverWithShareLinkFetcher.resolve({
url: url.toString(),
headers: {
[SharingLinkHeader.isSharingLinkToRedeem]: true,
[SharingLinkHeader.isNonDurableRedeem]: true,
},
});
});
assert(
resolvedUrl.shareLinkInfo?.isNonDurableRedeem === true,
"Sharing link should be set in resolved url",
);
});

it("isNonDurableRedeem should not be set when isSharingLinkToRedeem header is not set", async () => {
const url = new URL(sharelink);
const resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {
storeLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });
return urlResolverWithShareLinkFetcher.resolve({
url: url.toString(),
headers: {
[SharingLinkHeader.isNonDurableRedeem]: true,
},
});
});
assert(
resolvedUrl.shareLinkInfo?.isNonDurableRedeem === undefined,
"Sharing link should not be set in resolved url",
);
});

it("Encode and decode nav param", async () => {
const encodedUrl = new URL(sharelink);
storeLocatorInOdspUrl(encodedUrl, {
Expand Down
Loading