diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 031da8fee..08ebd1c45 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -34,9 +34,6 @@ CLASS lcl_git_transport DEFINITION FINAL. RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list RAISING lcx_exception. -* CLASS-METHODS class_constructor. - - PRIVATE SECTION. CONSTANTS: BEGIN OF c_service, receive TYPE string VALUE 'receive', "#EC NOTEXT @@ -46,7 +43,7 @@ CLASS lcl_git_transport DEFINITION FINAL. CLASS-METHODS branch_list IMPORTING iv_url TYPE string iv_service TYPE string - EXPORTING ei_client TYPE REF TO if_http_client + EXPORTING eo_client TYPE REF TO lcl_http_client eo_branch_list TYPE REF TO lcl_git_branch_list RAISING lcx_exception. @@ -54,7 +51,7 @@ CLASS lcl_git_transport DEFINITION FINAL. IMPORTING iv_url TYPE string iv_service TYPE string iv_branch_name TYPE string - EXPORTING ei_client TYPE REF TO if_http_client + EXPORTING eo_client TYPE REF TO lcl_http_client ev_branch TYPE ty_sha1 RAISING lcx_exception. @@ -63,12 +60,6 @@ CLASS lcl_git_transport DEFINITION FINAL. CHANGING cv_data TYPE xstring RAISING lcx_exception. - CLASS-METHODS set_headers - IMPORTING iv_url TYPE string - iv_service TYPE string - ii_client TYPE REF TO if_http_client - RAISING lcx_exception. - ENDCLASS. "lcl_transport DEFINITION *----------------------------------------------------------------------* @@ -169,37 +160,6 @@ ENDCLASS. "lcl_pack DEFINITION *----------------------------------------------------------------------* CLASS lcl_git_transport IMPLEMENTATION. - METHOD set_headers. - - DATA: lv_value TYPE string. - - - ii_client->request->set_header_field( - name = '~request_method' - value = 'POST' ). - - lv_value = lcl_url=>path_name( iv_url ) && - '/git-' && - iv_service && - '-pack'. - ii_client->request->set_header_field( - name = '~request_uri' - value = lv_value ). - - lv_value = 'application/x-git-' - && iv_service && '-pack-request'. "#EC NOTEXT - ii_client->request->set_header_field( - name = 'Content-Type' - value = lv_value ). "#EC NOTEXT - - lv_value = 'application/x-git-' - && iv_service && '-pack-result'. "#EC NOTEXT - ii_client->request->set_header_field( - name = 'Accept' - value = lv_value ). "#EC NOTEXT - - ENDMETHOD. "set_headers - METHOD find_branch. DATA: lo_branch_list TYPE REF TO lcl_git_branch_list. @@ -209,7 +169,7 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_url = iv_url iv_service = iv_service IMPORTING - ei_client = ei_client + eo_client = eo_client eo_branch_list = lo_branch_list ). IF ev_branch IS SUPPLIED. @@ -220,7 +180,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD branches. - DATA: li_client TYPE REF TO if_http_client. + DATA: lo_client TYPE REF TO lcl_http_client. lcl_git_transport=>branch_list( @@ -228,10 +188,10 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_url = iv_url iv_service = c_service-upload IMPORTING - ei_client = li_client + eo_client = lo_client eo_branch_list = ro_branch_list ). - li_client->close( ). + lo_client->close( ). ENDMETHOD. "branches @@ -240,11 +200,11 @@ CLASS lcl_git_transport IMPLEMENTATION. DATA: lv_data TYPE string. - ei_client = lcl_http=>create_by_url( + eo_client = lcl_http=>create_by_url( iv_url = iv_url iv_service = iv_service ). - lv_data = ei_client->response->get_cdata( ). + lv_data = eo_client->get_cdata( ). CREATE OBJECT eo_branch_list EXPORTING @@ -254,7 +214,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD receive_pack. - DATA: li_client TYPE REF TO if_http_client, + DATA: lo_client TYPE REF TO lcl_http_client, lv_cmd_pkt TYPE string, lv_line TYPE string, lv_tmp TYPE xstring, @@ -270,12 +230,11 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_service = c_service-receive iv_branch_name = iv_branch_name IMPORTING - ei_client = li_client ). + eo_client = lo_client ). - set_headers( + lo_client->set_headers( iv_url = iv_url - iv_service = c_service-receive - ii_client = li_client ). + iv_service = c_service-receive ). lv_cap_list = 'report-status agent=' && lcl_http=>get_agent( ) ##NO_TEXT. @@ -295,13 +254,7 @@ CLASS lcl_git_transport IMPLEMENTATION. CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE. - li_client->request->set_data( lv_xstring ). - - lcl_http=>send_receive( li_client ). - lcl_http=>check_http_200( li_client ). - - lv_xstring = li_client->response->get_data( ). - li_client->close( ). + lv_xstring = lo_client->send_receive_close( lv_xstring ). lv_string = lcl_convert=>xstring_to_string_utf8( lv_xstring ). IF NOT lv_string CP '*unpack ok*'. @@ -350,7 +303,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD upload_pack. - DATA: li_client TYPE REF TO if_http_client, + DATA: lo_client TYPE REF TO lcl_http_client, lv_buffer TYPE string, lv_xstring TYPE xstring, lv_line TYPE string, @@ -369,7 +322,7 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_service = c_service-upload iv_branch_name = io_repo->get_branch_name( ) IMPORTING - ei_client = li_client + eo_client = lo_client ev_branch = ev_branch ). IF it_branches IS INITIAL. @@ -379,9 +332,8 @@ CLASS lcl_git_transport IMPLEMENTATION. lt_branches = it_branches. ENDIF. - set_headers( iv_url = io_repo->get_url( ) - iv_service = c_service-upload - ii_client = li_client ). + lo_client->set_headers( iv_url = io_repo->get_url( ) + iv_service = c_service-upload ). LOOP AT lt_branches FROM 1 ASSIGNING . IF sy-tabix = 1. @@ -403,12 +355,7 @@ CLASS lcl_git_transport IMPLEMENTATION. && '0000' && '0009done' && gc_newline. -* do not use set_cdata as it modifies the Content-Type header field - li_client->request->set_data( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ). - lcl_http=>send_receive( li_client ). - lcl_http=>check_http_200( li_client ). - lv_xstring = li_client->response->get_data( ). - li_client->close( ). + lv_xstring = lo_client->send_receive_close( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ). parse( IMPORTING ev_pack = lv_pack CHANGING cv_data = lv_xstring ). diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap index 22542cf65..0db9bd11a 100644 --- a/src/zabapgit_http.prog.abap +++ b/src/zabapgit_http.prog.abap @@ -2,6 +2,153 @@ *& Include ZABAPGIT_HTTP *&---------------------------------------------------------------------* +CLASS lcl_http_client DEFINITION FINAL. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING ii_client TYPE REF TO if_http_client, + close, + send_receive_close + IMPORTING + iv_data TYPE xstring + RETURNING + VALUE(rv_data) TYPE xstring + RAISING lcx_exception, + get_cdata + RETURNING VALUE(rv_value) TYPE string, + check_http_200 + RAISING lcx_exception, + send_receive + RAISING lcx_exception, + set_headers + IMPORTING iv_url TYPE string + iv_service TYPE string + RAISING lcx_exception. + + PROTECTED SECTION. + DATA: mi_client TYPE REF TO if_http_client. + +ENDCLASS. + +CLASS lcl_http_client IMPLEMENTATION. + + METHOD constructor. + mi_client = ii_client. + ENDMETHOD. + + METHOD send_receive_close. + +* do not use set_cdata as it modifies the Content-Type header field + mi_client->request->set_data( iv_data ). + send_receive( ). + check_http_200( ). + rv_data = mi_client->response->get_data( ). + mi_client->close( ). + + ENDMETHOD. + + METHOD get_cdata. + rv_value = mi_client->response->get_cdata( ). + ENDMETHOD. + + METHOD close. + mi_client->close( ). + ENDMETHOD. + + METHOD set_headers. + + DATA: lv_value TYPE string. + + + mi_client->request->set_header_field( + name = '~request_method' + value = 'POST' ). + + lv_value = lcl_url=>path_name( iv_url ) && + '/git-' && + iv_service && + '-pack'. + mi_client->request->set_header_field( + name = '~request_uri' + value = lv_value ). + + lv_value = 'application/x-git-' + && iv_service && '-pack-request'. "#EC NOTEXT + mi_client->request->set_header_field( + name = 'Content-Type' + value = lv_value ). "#EC NOTEXT + + lv_value = 'application/x-git-' + && iv_service && '-pack-result'. "#EC NOTEXT + mi_client->request->set_header_field( + name = 'Accept' + value = lv_value ). "#EC NOTEXT + + ENDMETHOD. "set_headers + + METHOD send_receive. + + DATA lv_text TYPE string. + + mi_client->send( ). + mi_client->receive( + EXCEPTIONS + http_communication_failure = 1 + http_invalid_state = 2 + http_processing_failed = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + CASE sy-subrc. + WHEN 1. + " make sure: + " a) SSL is setup properly in STRUST + " b) no firewalls + " check trace file in transaction SMICM + lv_text = 'HTTP Communication Failure'. "#EC NOTEXT + WHEN 2. + lv_text = 'HTTP Invalid State'. "#EC NOTEXT + WHEN 3. + lv_text = 'HTTP Processing failed'. "#EC NOTEXT + WHEN OTHERS. + lv_text = 'Another error occured'. "#EC NOTEXT + ENDCASE. + lcx_exception=>raise( lv_text ). + ENDIF. + + ENDMETHOD. "send_receive + + METHOD check_http_200. + + DATA: lv_code TYPE i, + lv_text TYPE string. + + + mi_client->response->get_status( + IMPORTING + code = lv_code ). + CASE lv_code. + WHEN 200. + RETURN. + WHEN 302. + lcx_exception=>raise( 'HTTP redirect, check URL' ). + WHEN 401. + lcx_exception=>raise( 'HTTP 401, unauthorized' ). + WHEN 403. + lcx_exception=>raise( 'HTTP 403, forbidden' ). + WHEN 404. + lcx_exception=>raise( 'HTTP 404, not found' ). + WHEN 415. + lcx_exception=>raise( 'HTTP 415, unsupported media type' ). + WHEN OTHERS. + lv_text = mi_client->response->get_cdata( ). + lcx_exception=>raise( |HTTP error code: { lv_code }, { lv_text }| ). + ENDCASE. + + ENDMETHOD. "http_200 + +ENDCLASS. + CLASS lcl_http_digest DEFINITION FINAL. PUBLIC SECTION. @@ -95,14 +242,14 @@ CLASS lcl_http_digest IMPLEMENTATION. iv_qop = lv_qop iv_realm = lv_realm iv_nonce = lv_nonce - iv_username = p_user + iv_username = iv_username iv_uri = lv_uri iv_method = lv_method iv_cnonse = lv_cnonce - iv_password = p_pass ). + iv_password = iv_password ). * client response - lv_auth = |Digest username="{ p_user + lv_auth = |Digest username="{ iv_username }", realm="{ lv_realm }", nonce="{ lv_nonce }", uri="{ lv_uri @@ -165,18 +312,12 @@ CLASS lcl_http DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS: - check_http_200 - IMPORTING ii_client TYPE REF TO if_http_client - RAISING lcx_exception, - send_receive - IMPORTING ii_client TYPE REF TO if_http_client - RAISING lcx_exception, get_agent RETURNING VALUE(rv_agent) TYPE string, create_by_url IMPORTING iv_url TYPE string iv_service TYPE string - RETURNING VALUE(ri_client) TYPE REF TO if_http_client + RETURNING VALUE(ro_client) TYPE REF TO lcl_http_client RAISING lcx_exception. PRIVATE SECTION. @@ -208,6 +349,7 @@ CLASS lcl_http IMPLEMENTATION. DATA: lv_uri TYPE string, lv_expect_potentual_auth TYPE abap_bool, + li_client TYPE REF TO if_http_client, lo_settings TYPE REF TO lcl_settings. @@ -220,43 +362,47 @@ CLASS lcl_http IMPLEMENTATION. proxy_host = lo_settings->get_proxy_url( ) proxy_service = lo_settings->get_proxy_port( ) IMPORTING - client = ri_client ). + client = li_client ). + + CREATE OBJECT ro_client + EXPORTING + ii_client = li_client. IF is_local_system( iv_url ) = abap_true. - ri_client->send_sap_logon_ticket( ). + li_client->send_sap_logon_ticket( ). ENDIF. - ri_client->request->set_cdata( '' ). - ri_client->request->set_header_field( + li_client->request->set_cdata( '' ). + li_client->request->set_header_field( name = '~request_method' value = 'GET' ). - ri_client->request->set_header_field( + li_client->request->set_header_field( name = 'user-agent' value = get_agent( ) ). "#EC NOTEXT lv_uri = lcl_url=>path_name( iv_url ) && '/info/refs?service=git-' && iv_service && '-pack'. - ri_client->request->set_header_field( + li_client->request->set_header_field( name = '~request_uri' value = lv_uri ). " Disable internal auth dialog (due to its unclarity) - ri_client->propertytype_logon_popup = if_http_client=>co_disabled. + li_client->propertytype_logon_popup = if_http_client=>co_disabled. lcl_login_manager=>load( iv_uri = iv_url - ii_client = ri_client ). + ii_client = li_client ). - send_receive( ri_client ). - IF check_auth_requested( ri_client ) = abap_true. - acquire_login_details( ii_client = ri_client + ro_client->send_receive( ). + IF check_auth_requested( li_client ) = abap_true. + acquire_login_details( ii_client = li_client iv_url = iv_url ). - send_receive( ri_client ). + ro_client->send_receive( ). ENDIF. - check_http_200( ri_client ). + ro_client->check_http_200( ). lcl_login_manager=>save( iv_uri = iv_url - ii_client = ri_client ). + ii_client = li_client ). ENDMETHOD. @@ -286,37 +432,6 @@ CLASS lcl_http IMPLEMENTATION. ENDMETHOD. - METHOD send_receive. - - DATA lv_text TYPE string. - - ii_client->send( ). - ii_client->receive( - EXCEPTIONS - http_communication_failure = 1 - http_invalid_state = 2 - http_processing_failed = 3 - OTHERS = 4 ). - IF sy-subrc <> 0. - CASE sy-subrc. - WHEN 1. - " make sure: - " a) SSL is setup properly in STRUST - " b) no firewalls - " check trace file in transaction SMICM - lv_text = 'HTTP Communication Failure'. "#EC NOTEXT - WHEN 2. - lv_text = 'HTTP Invalid State'. "#EC NOTEXT - WHEN 3. - lv_text = 'HTTP Processing failed'. "#EC NOTEXT - WHEN OTHERS. - lv_text = 'Another error occured'. "#EC NOTEXT - ENDCASE. - lcx_exception=>raise( lv_text ). - ENDIF. - - ENDMETHOD. "send_receive - METHOD check_auth_requested. DATA: lv_code TYPE i. @@ -377,33 +492,4 @@ CLASS lcl_http IMPLEMENTATION. ENDMETHOD. "acquire_login_details - METHOD check_http_200. - - DATA: lv_code TYPE i, - lv_text TYPE string. - - - ii_client->response->get_status( - IMPORTING - code = lv_code ). - CASE lv_code. - WHEN 200. - RETURN. - WHEN 302. - lcx_exception=>raise( 'HTTP redirect, check URL' ). - WHEN 401. - lcx_exception=>raise( 'HTTP 401, unauthorized' ). - WHEN 403. - lcx_exception=>raise( 'HTTP 403, forbidden' ). - WHEN 404. - lcx_exception=>raise( 'HTTP 404, not found' ). - WHEN 415. - lcx_exception=>raise( 'HTTP 415, unsupported media type' ). - WHEN OTHERS. - lv_text = ii_client->response->get_cdata( ). - lcx_exception=>raise( |HTTP error code: { lv_code }, { lv_text }| ). - ENDCASE. - - ENDMETHOD. "http_200 - ENDCLASS. \ No newline at end of file