diff --git a/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap index 6b6cb84e6..61df0cccc 100644 --- a/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap +++ b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap @@ -52,18 +52,24 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION. METHOD dbcontent_decode. - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. + DATA lt_fields TYPE tihttpnvp. + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( + it_post_data = it_postdata + iv_upper_cased = abap_true ). - lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ). - - lv_string = cl_http_utility=>unescape_url( lv_string ). - - rs_content = zcl_abapgit_html_action_utils=>dbkey_decode( lv_string ). - - lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). - + zcl_abapgit_html_action_utils=>get_field( + EXPORTING + iv_name = 'TYPE' + it_field = lt_fields + CHANGING + cg_field = rs_content-type ). + zcl_abapgit_html_action_utils=>get_field( + EXPORTING + iv_name = 'VALUE' + it_field = lt_fields + CHANGING + cg_field = rs_content-value ). zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'XMLDATA' diff --git a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap index 89aa71d69..c4a22b17d 100644 --- a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap @@ -93,7 +93,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. DATA lt_form TYPE tihttpnvp. DATA ls_field LIKE LINE OF lt_form. - lt_form = zcl_abapgit_html_action_utils=>parse_post_data( it_post_data ). + lt_form = zcl_abapgit_html_action_utils=>parse_post_form_data( it_post_data ). CREATE OBJECT ro_form_data. LOOP AT lt_form INTO ls_field. diff --git a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap index e2dab9755..609f53609 100644 --- a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap @@ -245,15 +245,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. METHOD decode_merge. - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. - + DATA lt_fields TYPE tihttpnvp. FIELD-SYMBOLS: LIKE LINE OF lt_fields. - lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ). - - lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). READ TABLE lt_fields ASSIGNING WITH KEY name = 'source'. ASSERT sy-subrc = 0. diff --git a/src/ui/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/zcl_abapgit_gui_page_commit.clas.abap index 91959637a..5370cdc30 100644 --- a/src/ui/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_commit.clas.abap @@ -177,19 +177,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. METHOD parse_commit_request. - CONSTANTS: lc_replace TYPE string VALUE '<>'. - - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. + DATA lt_fields TYPE tihttpnvp. FIELD-SYMBOLS TYPE string. CLEAR eg_fields. - CONCATENATE LINES OF it_postdata INTO lv_string. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_string WITH lc_replace. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_string WITH lc_replace. - lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( + it_post_data = it_postdata + iv_upper_cased = abap_true ). zcl_abapgit_html_action_utils=>get_field( EXPORTING @@ -230,7 +226,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. ASSIGN COMPONENT 'BODY' OF STRUCTURE eg_fields TO . ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>c_newline. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN WITH zif_abapgit_definitions=>c_newline. ENDMETHOD. diff --git a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap index 2be0c9ef2..c959113cf 100644 --- a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap @@ -112,37 +112,36 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION. METHOD apply_merged_content. - CONSTANTS: lc_replace TYPE string VALUE '<>'. + DATA: + BEGIN OF ls_filedata, + merge_content TYPE string, + END OF ls_filedata, + lt_fields TYPE tihttpnvp, + lv_new_file_content TYPE xstring. - DATA: BEGIN OF ls_filedata, - merge_content TYPE string, - END OF ls_filedata. + FIELD-SYMBOLS: + TYPE zif_abapgit_definitions=>ty_merge_conflict. - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp, - lv_new_file_content TYPE xstring. + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( + it_post_data = it_postdata + iv_upper_cased = abap_true ). - FIELD-SYMBOLS: LIKE LINE OF it_postdata, - TYPE zif_abapgit_definitions=>ty_merge_conflict. + zcl_abapgit_html_action_utils=>get_field( + EXPORTING + iv_name = 'MERGE_CONTENT' + it_field = lt_fields + CHANGING + cg_field = ls_filedata ). - LOOP AT it_postdata ASSIGNING . - lv_string = |{ lv_string }{ }|. - ENDLOOP. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_string WITH lc_replace. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_string WITH lc_replace. - - lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'MERGE_CONTENT' - it_field = lt_fields - CHANGING cg_field = ls_filedata ). - ls_filedata-merge_content = cl_http_utility=>unescape_url( escaped = ls_filedata-merge_content ). - REPLACE ALL OCCURRENCES OF lc_replace IN ls_filedata-merge_content WITH zif_abapgit_definitions=>c_newline. + REPLACE ALL OCCURRENCES + OF zif_abapgit_definitions=>c_crlf IN ls_filedata-merge_content WITH zif_abapgit_definitions=>c_newline. lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( ls_filedata-merge_content ). READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. - -result_sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>c_type-blob - iv_data = lv_new_file_content ). + -result_sha1 = zcl_abapgit_hash=>sha1( + iv_type = zif_abapgit_definitions=>c_type-blob + iv_data = lv_new_file_content ). -result_data = lv_new_file_content. mo_merge->resolve_conflict( ). diff --git a/src/ui/zcl_abapgit_gui_page_patch.clas.abap b/src/ui/zcl_abapgit_gui_page_patch.clas.abap index b8d9e67da..9d565556a 100644 --- a/src/ui/zcl_abapgit_gui_page_patch.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_patch.clas.abap @@ -318,13 +318,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION. METHOD apply_patch_from_form_fields. - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp, - lv_add TYPE string, - lv_remove TYPE string. + DATA: + lt_fields TYPE tihttpnvp, + lv_add TYPE string, + lv_remove TYPE string. - lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ). - lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = c_patch_action-add it_field = lt_fields diff --git a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap index abf34e98c..6d8943757 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap @@ -54,11 +54,6 @@ CLASS zcl_abapgit_gui_page_repo_sett DEFINITION !it_post_fields TYPE tihttpnvp RAISING zcx_abapgit_exception . - METHODS parse_post - IMPORTING - !it_postdata TYPE cnht_post_data_tab - RETURNING - VALUE(rt_post_fields) TYPE tihttpnvp . METHODS render_dot_abapgit_reqs IMPORTING ii_html TYPE REF TO zif_abapgit_html @@ -90,16 +85,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ENDMETHOD. - METHOD parse_post. - - DATA lv_serialized_post_data TYPE string. - - lv_serialized_post_data = zcl_abapgit_utils=>translate_postdata( it_postdata ). - rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). - - ENDMETHOD. - - METHOD render_content. CREATE OBJECT ri_html TYPE zcl_abapgit_html. @@ -352,7 +337,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. DATA: lt_post_fields TYPE tihttpnvp, lv_msg TYPE string. - lt_post_fields = parse_post( it_postdata ). + lt_post_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). save_dot_abap( lt_post_fields ). save_remotes( lt_post_fields ). diff --git a/src/ui/zcl_abapgit_gui_page_settings.clas.abap b/src/ui/zcl_abapgit_gui_page_settings.clas.abap index 47ef73ff1..a61368d8b 100644 --- a/src/ui/zcl_abapgit_gui_page_settings.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_settings.clas.abap @@ -61,11 +61,6 @@ CLASS zcl_abapgit_gui_page_settings DEFINITION IMPORTING !it_post_fields TYPE tihttpnvp . METHODS validate_settings . - METHODS parse_post - IMPORTING - !it_postdata TYPE cnht_post_data_tab - RETURNING - VALUE(rt_post_fields) TYPE tihttpnvp . METHODS persist_settings RAISING zcx_abapgit_exception . @@ -124,16 +119,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETTINGS IMPLEMENTATION. ENDMETHOD. - METHOD parse_post. - - DATA lv_serialized_post_data TYPE string. - - lv_serialized_post_data = zcl_abapgit_utils=>translate_postdata( it_postdata ). - rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). - - ENDMETHOD. - - METHOD persist_settings. DATA lo_settings_persistence TYPE REF TO zcl_abapgit_persist_settings. @@ -719,7 +704,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETTINGS IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_action-save_settings. - lt_post_fields = parse_post( ii_event->mt_postdata ). + lt_post_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( ii_event->mt_postdata ). post( lt_post_fields ). validate_settings( ). diff --git a/src/ui/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/zcl_abapgit_gui_page_stage.clas.abap index aa961699e..9b35e402f 100644 --- a/src/ui/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_stage.clas.abap @@ -587,16 +587,16 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. METHOD stage_selected. - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp, - ls_file TYPE zif_abapgit_definitions=>ty_file. + DATA: + lt_fields TYPE tihttpnvp, + ls_file TYPE zif_abapgit_definitions=>ty_file. - FIELD-SYMBOLS: LIKE LINE OF ms_files-local, - LIKE LINE OF ms_files-status, - LIKE LINE OF lt_fields. + FIELD-SYMBOLS: + LIKE LINE OF ms_files-local, + LIKE LINE OF ms_files-status, + LIKE LINE OF lt_fields. - lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ). - lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). IF lines( lt_fields ) = 0. zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ). @@ -687,7 +687,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. WHEN c_action-stage_filter. - lt_fields = zcl_abapgit_html_action_utils=>parse_fields( concat_lines_of( table = ii_event->mt_postdata ) ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( ii_event->mt_postdata ). zcl_abapgit_html_action_utils=>get_field( EXPORTING diff --git a/src/ui/zcl_abapgit_gui_page_tag.clas.abap b/src/ui/zcl_abapgit_gui_page_tag.clas.abap index 063f707a8..2979f7257 100644 --- a/src/ui/zcl_abapgit_gui_page_tag.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_tag.clas.abap @@ -153,19 +153,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION. METHOD parse_tag_request. - CONSTANTS: lc_replace TYPE string VALUE '<>'. - - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. + DATA lt_fields TYPE tihttpnvp. FIELD-SYMBOLS TYPE string. CLEAR eg_fields. - lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ). - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_string WITH lc_replace. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_string WITH lc_replace. - lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( + it_post_data = it_postdata + iv_upper_cased = abap_true ). zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'SHA1' it_field = lt_fields @@ -188,7 +184,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION. ASSIGN COMPONENT 'BODY' OF STRUCTURE eg_fields TO . ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>c_newline. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN WITH zif_abapgit_definitions=>c_newline. ENDMETHOD. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index 5e69849a2..d140e5a50 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -4,9 +4,10 @@ CLASS zcl_abapgit_html_action_utils DEFINITION PUBLIC SECTION. - CLASS-METHODS parse_post_data + CLASS-METHODS parse_post_form_data IMPORTING !it_post_data TYPE cnht_post_data_tab + !iv_upper_cased TYPE abap_bool DEFAULT abap_false RETURNING VALUE(rt_fields) TYPE tihttpnvp . CLASS-METHODS parse_fields @@ -19,6 +20,12 @@ CLASS zcl_abapgit_html_action_utils DEFINITION !iv_string TYPE clike RETURNING VALUE(rt_fields) TYPE tihttpnvp . + CLASS-METHODS translate_postdata + IMPORTING + !it_postdata TYPE cnht_post_data_tab + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS get_field IMPORTING !iv_name TYPE string @@ -330,27 +337,33 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. METHOD parse_fields. - DATA: lt_substrings TYPE STANDARD TABLE OF string WITH DEFAULT KEY, - ls_field LIKE LINE OF rt_fields. - - FIELD-SYMBOLS: LIKE LINE OF lt_substrings. + DATA: + lt_substrings TYPE string_table, + ls_field LIKE LINE OF rt_fields. + FIELD-SYMBOLS LIKE LINE OF lt_substrings. SPLIT iv_string AT '&' INTO TABLE lt_substrings. LOOP AT lt_substrings ASSIGNING . - CLEAR: ls_field. + CLEAR ls_field. - ls_field-name = substring_before( val = - sub = '=' ). + ls_field-name = substring_before( + val = + sub = '=' ). ls_field-name = unescape( ls_field-name ). - ls_field-value = substring_after( val = - sub = '=' ). + ls_field-value = substring_after( + val = + sub = '=' ). ls_field-value = unescape( ls_field-value ). - INSERT ls_field INTO TABLE rt_fields. + IF ls_field IS INITIAL. " Not a field with proper structure + CONTINUE. + ENDIF. + + APPEND ls_field TO rt_fields. ENDLOOP. @@ -365,12 +378,16 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. ENDMETHOD. - METHOD parse_post_data. + METHOD parse_post_form_data. DATA lv_serialized_post_data TYPE string. - CONCATENATE LINES OF it_post_data INTO lv_serialized_post_data. - rt_fields = parse_fields( lv_serialized_post_data ). + lv_serialized_post_data = translate_postdata( it_post_data ). + IF iv_upper_cased = abap_true. + rt_fields = parse_fields_upper_case_name( lv_serialized_post_data ). + ELSE. + rt_fields = parse_fields( lv_serialized_post_data ). + ENDIF. ENDMETHOD. @@ -391,6 +408,33 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. ENDMETHOD. + METHOD translate_postdata. + + DATA: lt_post_data TYPE cnht_post_data_tab, + ls_last_line TYPE cnht_post_data_line, + lv_last_line_index TYPE i. + + IF it_postdata IS INITIAL. + RETURN. "Nothing to do + ENDIF. + + lt_post_data = it_postdata. + + "Save the last line for separate merge, because we don't need its trailing spaces + WHILE ls_last_line IS INITIAL. + lv_last_line_index = lines( lt_post_data ). + READ TABLE lt_post_data INTO ls_last_line INDEX lv_last_line_index. + DELETE lt_post_data INDEX lv_last_line_index. + ENDWHILE. + + CONCATENATE LINES OF lt_post_data INTO rv_string + IN CHARACTER MODE RESPECTING BLANKS. + CONCATENATE rv_string ls_last_line INTO rv_string + IN CHARACTER MODE. + + ENDMETHOD. + + METHOD unescape. * do not use cl_http_utility as it does strange things with the encoding rv_string = iv_string. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap index 75d597361..eebe05a51 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap @@ -9,6 +9,8 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS METHODS parse_fields_advanced_case FOR TESTING. METHODS parse_fields_unescape FOR TESTING. METHODS parse_fields_german_umlauts FOR TESTING. + METHODS parse_fields_wrong_format FOR TESTING. + METHODS parse_post_form_data FOR TESTING. PRIVATE SECTION. @@ -36,6 +38,9 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS iv_index TYPE i iv_name TYPE string iv_value TYPE string. + METHODS _then_field_count_should_be + IMPORTING + iv_count TYPE i. CLASS-METHODS _hex_to_char IMPORTING @@ -65,12 +70,18 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ls_answer-value = 'TEST'. APPEND ls_answer TO lt_fields. - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'NAME' - it_field = lt_fields - CHANGING cg_field = ls_field-value ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'NAME' - it_field = lt_fields - CHANGING cg_field = ls_field ). + zcl_abapgit_html_action_utils=>get_field( + EXPORTING + iv_name = 'NAME' + it_field = lt_fields + CHANGING + cg_field = ls_field-value ). + zcl_abapgit_html_action_utils=>get_field( + EXPORTING + iv_name = 'NAME' + it_field = lt_fields + CHANGING + cg_field = ls_field ). ls_answer-name = 'TEST'. ls_answer-value = 'TEST'. @@ -208,19 +219,30 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF mt_parsed_fields. - READ TABLE mt_parsed_fields ASSIGNING - INDEX iv_index. + READ TABLE mt_parsed_fields ASSIGNING INDEX iv_index. - cl_abap_unit_assert=>assert_subrc( exp = 0 - msg = |No parsed field found at index { iv_index }| ). + cl_abap_unit_assert=>assert_subrc( + exp = 0 + msg = |No parsed field found at index { iv_index }| ). - cl_abap_unit_assert=>assert_equals( act = -name - exp = iv_name - msg = |Name at index { iv_index } should be { iv_name }| ). + cl_abap_unit_assert=>assert_equals( + act = -name + exp = iv_name + msg = |Name at index { iv_index } should be { iv_name }| ). - cl_abap_unit_assert=>assert_equals( act = -value - exp = iv_value - msg = |Value at index { iv_index } should be { iv_value }| ). + cl_abap_unit_assert=>assert_equals( + act = -value + exp = iv_value + msg = |Value at index { iv_index } should be { iv_value }| ). + + ENDMETHOD. + + METHOD _then_field_count_should_be. + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_parsed_fields ) + exp = iv_count + msg = |Field count { lines( mt_parsed_fields ) } should be { iv_count }| ). ENDMETHOD. @@ -233,4 +255,62 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ENDMETHOD. + METHOD parse_fields_wrong_format. + + _given_string_is( `some_query_string_without_param_structure` ). + _when_fields_are_parsed( ). + _then_field_count_should_be( 0 ). + + _given_string_is( `some_query_string_without_param_structure&a=b` ). + _when_fields_are_parsed( ). + _then_field_count_should_be( 1 ). + _then_fields_should_be( + iv_index = 1 + iv_name = 'A' + iv_value = 'b' ). + + ENDMETHOD. + + METHOD parse_post_form_data. + + DATA lt_post_data TYPE cnht_post_data_tab. + DATA lv_line LIKE LINE OF lt_post_data. + DATA lv_long_name LIKE LINE OF lt_post_data. + DATA lv_size TYPE i. + + DESCRIBE FIELD lv_line LENGTH lv_size IN CHARACTER MODE. + lv_long_name = repeat( + val = 'x' + occ = lv_size - 4 ). + lv_line = 'a=b&' && lv_long_name. + + APPEND lv_line TO lt_post_data. + APPEND '=y' TO lt_post_data. + + mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( lt_post_data ). + _then_field_count_should_be( 2 ). + _then_fields_should_be( + iv_index = 1 + iv_name = 'a' + iv_value = 'b' ). + _then_fields_should_be( + iv_index = 2 + iv_name = |{ lv_long_name }| + iv_value = 'y' ). + + mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( + it_post_data = lt_post_data + iv_upper_cased = abap_true ). + _then_field_count_should_be( 2 ). + _then_fields_should_be( + iv_index = 1 + iv_name = 'A' + iv_value = 'b' ). + _then_fields_should_be( + iv_index = 2 + iv_name = |{ to_upper( lv_long_name ) }| + iv_value = 'y' ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/utils/zcl_abapgit_utils.clas.abap b/src/utils/zcl_abapgit_utils.clas.abap index e4dc8d1a9..1b591105e 100644 --- a/src/utils/zcl_abapgit_utils.clas.abap +++ b/src/utils/zcl_abapgit_utils.clas.abap @@ -19,18 +19,29 @@ CLASS zcl_abapgit_utils DEFINITION !ev_time TYPE zif_abapgit_definitions=>ty_commit-time RAISING zcx_abapgit_exception . - CLASS-METHODS translate_postdata - IMPORTING - !it_postdata TYPE cnht_post_data_tab - RETURNING - VALUE(rv_string) TYPE string . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. -CLASS zcl_abapgit_utils IMPLEMENTATION. +CLASS ZCL_ABAPGIT_UTILS IMPLEMENTATION. + + + METHOD extract_author_data. + + " unix time stamps are in same time zone, so ignore the zone + FIND REGEX zif_abapgit_definitions=>c_author_regex IN iv_author + SUBMATCHES + ev_author + ev_email + ev_time. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error author regex value='{ iv_author }'| ). + ENDIF. + + ENDMETHOD. METHOD is_binary. @@ -61,48 +72,4 @@ CLASS zcl_abapgit_utils IMPLEMENTATION. ENDDO. ENDMETHOD. - - - METHOD extract_author_data. - - " unix time stamps are in same time zone, so ignore the zone - FIND REGEX zif_abapgit_definitions=>c_author_regex IN iv_author - SUBMATCHES - ev_author - ev_email - ev_time. - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Error author regex value='{ iv_author }'| ). - ENDIF. - - ENDMETHOD. - - - METHOD translate_postdata. - - DATA: lt_post_data TYPE cnht_post_data_tab, - ls_last_line TYPE cnht_post_data_line, - lv_last_line_index TYPE i. - - IF it_postdata IS INITIAL. - "Nothing to do - RETURN. - ENDIF. - - lt_post_data = it_postdata. - - "Save the last line for separate merge, because we don't need its trailing spaces - WHILE ls_last_line IS INITIAL. - lv_last_line_index = lines( lt_post_data ). - READ TABLE lt_post_data INTO ls_last_line INDEX lv_last_line_index. - DELETE lt_post_data INDEX lv_last_line_index. - ENDWHILE. - - CONCATENATE LINES OF lt_post_data INTO rv_string - IN CHARACTER MODE RESPECTING BLANKS. - CONCATENATE rv_string ls_last_line INTO rv_string - IN CHARACTER MODE. - - ENDMETHOD. ENDCLASS.