Skip to content

Commit dc72b03

Browse files
frij-awsbeqqrry-aws
authored andcommitted
presigner scenario for S3 GetObject
1 parent c1f8aff commit dc72b03

File tree

3 files changed

+143
-5
lines changed

3 files changed

+143
-5
lines changed

sap-abap/services/s3/zcl_aws1_s3_scenario.clas.abap

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,25 @@ CLASS zcl_aws1_s3_scenario DEFINITION
1010

1111
METHODS getting_started_with_s3
1212
IMPORTING
13-
!iv_bucket_name TYPE /aws1/s3_bucketname
14-
!iv_key TYPE /aws1/s3_objectkey
15-
!iv_copy_to_folder TYPE /aws1/s3_bucketname
13+
!iv_bucket_name TYPE /aws1/s3_bucketname
14+
!iv_key TYPE /aws1/s3_objectkey
15+
!iv_copy_to_folder TYPE /aws1/s3_bucketname
1616
EXPORTING
17-
!oo_result TYPE REF TO /aws1/cl_knsputrecordoutput .
17+
!oo_result TYPE REF TO /aws1/cl_knsputrecordoutput
18+
RAISING
19+
/aws1/cx_rt_service_generic
20+
/aws1/cx_rt_technical_generic
21+
/aws1/cx_rt_no_auth_generic .
22+
METHODS presigner_get
23+
IMPORTING
24+
!iv_bucket_name TYPE /aws1/s3_bucketname
25+
!iv_key TYPE /aws1/s3_objectkey
26+
RETURNING
27+
VALUE(ov_url) TYPE string
28+
RAISING
29+
/aws1/cx_rt_service_generic
30+
/aws1/cx_rt_technical_generic
31+
/aws1/cx_rt_no_auth_generic .
1832
PROTECTED SECTION.
1933
PRIVATE SECTION.
2034
ENDCLASS.
@@ -140,4 +154,44 @@ CLASS ZCL_AWS1_S3_SCENARIO IMPLEMENTATION.
140154
"snippet-end:[s3.abapv1.getting_started_with_s3]
141155

142156
ENDMETHOD.
157+
158+
159+
METHOD presigner_get.
160+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
161+
162+
"snippet-start:[s3.abapv1.s3_presigned_url_get]
163+
" iv_bucket_name is the bucket name
164+
" iv_key is the object name like "myfile.txt"
165+
166+
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
167+
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).
168+
169+
"Upload a nice Hello World file to an S3 bucket."
170+
TRY.
171+
DATA(lv_contents) = cl_abap_codepage=>convert_to( 'Hello, World' ).
172+
lo_s3->putobject(
173+
iv_bucket = iv_bucket_name
174+
iv_key = iv_key
175+
iv_body = lv_contents
176+
iv_contenttype = 'text/plain' ).
177+
MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'.
178+
CATCH /aws1/cx_s3_nosuchbucket.
179+
MESSAGE 'Bucket does not exist.' TYPE 'E'.
180+
ENDTRY.
181+
182+
" now generate a presigned URL with a 600-second expiration
183+
DATA(lo_presigner) = lo_s3->get_presigner( iv_expires_sec = 600 ).
184+
" the presigner getobject() method has the same signature as
185+
" lo_s3->getobject(), but it doesn't actually make the call.
186+
" to the service. It just prepares a presigned URL for a future call
187+
DATA(lo_presigned_req) = lo_presigner->getobject(
188+
iv_bucket = iv_bucket_name
189+
iv_key = iv_key ).
190+
191+
" You can provide this URL to a web page, user, email etc so they
192+
" can retrieve the file. The URL will expire in 10 minutes.
193+
ov_url = lo_presigned_req->get_url( ).
194+
"snippet-end:[s3.abapv1.s3_presigned_url_get]
195+
196+
ENDMETHOD.
143197
ENDCLASS.

sap-abap/services/s3/zcl_aws1_s3_scenario.clas.testclasses.abap

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ CLASS ltc_zcl_aws1_s3_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL
1818
DATA ao_s3_scenario TYPE REF TO zcl_aws1_s3_scenario.
1919

2020
METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic.
21-
21+
METHODS presigner_get_scenario FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error.
2222
METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic.
2323
METHODS teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic.
2424

@@ -75,4 +75,39 @@ CLASS ltc_zcl_aws1_s3_scenario IMPLEMENTATION.
7575
act = lv_found
7676
msg = |Bucket { av_bucket } should have been deleted| ).
7777
ENDMETHOD.
78+
79+
METHOD presigner_get_scenario.
80+
" we don't show the customer the bucket creation in this scenario.
81+
" So we'll create a separate bucket just for this scenario
82+
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
83+
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).
84+
85+
DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ).
86+
DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf.
87+
IF lv_region = 'us-east-1'.
88+
CLEAR lo_constraint.
89+
ELSE.
90+
lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ).
91+
ENDIF.
92+
93+
DATA(lv_uuid) = cl_system_uuid=>if_system_uuid_static~create_uuid_c32( ).
94+
TRANSLATE lv_uuid TO LOWER CASE.
95+
DATA(lv_bucket_name) = |sap-abap-s3-scenario-presigner-{ lv_uuid }|.
96+
97+
lo_s3->createbucket(
98+
iv_bucket = lv_bucket_name
99+
io_createbucketconfiguration = lo_constraint ).
100+
101+
102+
DATA(lv_url) = ao_s3_scenario->presigner_get(
103+
iv_bucket_name = lv_bucket_name
104+
iv_key = cv_file ).
105+
ASSERT lv_url IS NOT INITIAL.
106+
107+
" cleanup
108+
lo_s3->deleteobject( iv_bucket = lv_bucket_name iv_key = cv_file ).
109+
lo_s3->deletebucket( iv_bucket = lv_bucket_name ).
110+
111+
ENDMETHOD.
112+
78113
ENDCLASS.

sap-abap/services/s3/zcl_aws1_s3_scenario.clas.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,56 @@
1818
<LANGU>E</LANGU>
1919
<DESCRIPT>Getting started with Amazon S3 buckets and objects.</DESCRIPT>
2020
</SEOCOMPOTX>
21+
<SEOCOMPOTX>
22+
<CMPNAME>PRESIGNER_GET</CMPNAME>
23+
<LANGU>E</LANGU>
24+
<DESCRIPT>Getting started with Amazon S3 buckets and objects.</DESCRIPT>
25+
</SEOCOMPOTX>
2126
</DESCRIPTIONS>
27+
<DESCRIPTIONS_SUB>
28+
<SEOSUBCOTX>
29+
<CMPNAME>GETTING_STARTED_WITH_S3</CMPNAME>
30+
<SCONAME>/AWS1/CX_RT_NO_AUTH_GENERIC</SCONAME>
31+
<LANGU>E</LANGU>
32+
<DESCRIPT>Generic lack of authorization</DESCRIPT>
33+
</SEOSUBCOTX>
34+
<SEOSUBCOTX>
35+
<CMPNAME>GETTING_STARTED_WITH_S3</CMPNAME>
36+
<SCONAME>/AWS1/CX_RT_SERVICE_GENERIC</SCONAME>
37+
<LANGU>E</LANGU>
38+
<DESCRIPT>Generic Service call error</DESCRIPT>
39+
</SEOSUBCOTX>
40+
<SEOSUBCOTX>
41+
<CMPNAME>GETTING_STARTED_WITH_S3</CMPNAME>
42+
<SCONAME>/AWS1/CX_RT_TECHNICAL_GENERIC</SCONAME>
43+
<LANGU>E</LANGU>
44+
<DESCRIPT>Technical errors</DESCRIPT>
45+
</SEOSUBCOTX>
46+
<SEOSUBCOTX>
47+
<CMPNAME>PRESIGNER_GET</CMPNAME>
48+
<SCONAME>/AWS1/CX_RT_NO_AUTH_GENERIC</SCONAME>
49+
<LANGU>E</LANGU>
50+
<DESCRIPT>Generic lack of authorization</DESCRIPT>
51+
</SEOSUBCOTX>
52+
<SEOSUBCOTX>
53+
<CMPNAME>PRESIGNER_GET</CMPNAME>
54+
<SCONAME>/AWS1/CX_RT_SERVICE_GENERIC</SCONAME>
55+
<LANGU>E</LANGU>
56+
<DESCRIPT>Generic Service call error</DESCRIPT>
57+
</SEOSUBCOTX>
58+
<SEOSUBCOTX>
59+
<CMPNAME>PRESIGNER_GET</CMPNAME>
60+
<SCONAME>/AWS1/CX_RT_TECHNICAL_GENERIC</SCONAME>
61+
<LANGU>E</LANGU>
62+
<DESCRIPT>Technical errors</DESCRIPT>
63+
</SEOSUBCOTX>
64+
<SEOSUBCOTX>
65+
<CMPNAME>PRESIGNER_GET</CMPNAME>
66+
<SCONAME>IV_KEY</SCONAME>
67+
<LANGU>E</LANGU>
68+
<DESCRIPT>Object Key</DESCRIPT>
69+
</SEOSUBCOTX>
70+
</DESCRIPTIONS_SUB>
2271
</asx:values>
2372
</asx:abap>
2473
</abapGit>

0 commit comments

Comments
 (0)