more refactoring, new lcl_http_client class

This commit is contained in:
larshp 2016-11-15 15:13:37 +00:00
parent a9549aaa2c
commit 42a918609e
2 changed files with 188 additions and 155 deletions

View File

@ -34,9 +34,6 @@ CLASS lcl_git_transport DEFINITION FINAL.
RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list
RAISING lcx_exception. RAISING lcx_exception.
* CLASS-METHODS class_constructor.
PRIVATE SECTION. PRIVATE SECTION.
CONSTANTS: BEGIN OF c_service, CONSTANTS: BEGIN OF c_service,
receive TYPE string VALUE 'receive', "#EC NOTEXT receive TYPE string VALUE 'receive', "#EC NOTEXT
@ -46,7 +43,7 @@ CLASS lcl_git_transport DEFINITION FINAL.
CLASS-METHODS branch_list CLASS-METHODS branch_list
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
iv_service 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 eo_branch_list TYPE REF TO lcl_git_branch_list
RAISING lcx_exception. RAISING lcx_exception.
@ -54,7 +51,7 @@ CLASS lcl_git_transport DEFINITION FINAL.
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
iv_service TYPE string iv_service TYPE string
iv_branch_name 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 ev_branch TYPE ty_sha1
RAISING lcx_exception. RAISING lcx_exception.
@ -63,12 +60,6 @@ CLASS lcl_git_transport DEFINITION FINAL.
CHANGING cv_data TYPE xstring CHANGING cv_data TYPE xstring
RAISING lcx_exception. 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 ENDCLASS. "lcl_transport DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -169,37 +160,6 @@ ENDCLASS. "lcl_pack DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_git_transport IMPLEMENTATION. 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. METHOD find_branch.
DATA: lo_branch_list TYPE REF TO lcl_git_branch_list. 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_url = iv_url
iv_service = iv_service iv_service = iv_service
IMPORTING IMPORTING
ei_client = ei_client eo_client = eo_client
eo_branch_list = lo_branch_list ). eo_branch_list = lo_branch_list ).
IF ev_branch IS SUPPLIED. IF ev_branch IS SUPPLIED.
@ -220,7 +180,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
METHOD branches. 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( lcl_git_transport=>branch_list(
@ -228,10 +188,10 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_url = iv_url iv_url = iv_url
iv_service = c_service-upload iv_service = c_service-upload
IMPORTING IMPORTING
ei_client = li_client eo_client = lo_client
eo_branch_list = ro_branch_list ). eo_branch_list = ro_branch_list ).
li_client->close( ). lo_client->close( ).
ENDMETHOD. "branches ENDMETHOD. "branches
@ -240,11 +200,11 @@ CLASS lcl_git_transport IMPLEMENTATION.
DATA: lv_data TYPE string. DATA: lv_data TYPE string.
ei_client = lcl_http=>create_by_url( eo_client = lcl_http=>create_by_url(
iv_url = iv_url iv_url = iv_url
iv_service = iv_service ). iv_service = iv_service ).
lv_data = ei_client->response->get_cdata( ). lv_data = eo_client->get_cdata( ).
CREATE OBJECT eo_branch_list CREATE OBJECT eo_branch_list
EXPORTING EXPORTING
@ -254,7 +214,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
METHOD receive_pack. 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_cmd_pkt TYPE string,
lv_line TYPE string, lv_line TYPE string,
lv_tmp TYPE xstring, lv_tmp TYPE xstring,
@ -270,12 +230,11 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_service = c_service-receive iv_service = c_service-receive
iv_branch_name = iv_branch_name iv_branch_name = iv_branch_name
IMPORTING IMPORTING
ei_client = li_client ). eo_client = lo_client ).
set_headers( lo_client->set_headers(
iv_url = iv_url iv_url = iv_url
iv_service = c_service-receive iv_service = c_service-receive ).
ii_client = li_client ).
lv_cap_list = 'report-status agent=' && lcl_http=>get_agent( ) ##NO_TEXT. 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. CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
li_client->request->set_data( lv_xstring ). lv_xstring = lo_client->send_receive_close( 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_string = lcl_convert=>xstring_to_string_utf8( lv_xstring ). lv_string = lcl_convert=>xstring_to_string_utf8( lv_xstring ).
IF NOT lv_string CP '*unpack ok*'. IF NOT lv_string CP '*unpack ok*'.
@ -350,7 +303,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
METHOD upload_pack. 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_buffer TYPE string,
lv_xstring TYPE xstring, lv_xstring TYPE xstring,
lv_line TYPE string, lv_line TYPE string,
@ -369,7 +322,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_service = c_service-upload iv_service = c_service-upload
iv_branch_name = io_repo->get_branch_name( ) iv_branch_name = io_repo->get_branch_name( )
IMPORTING IMPORTING
ei_client = li_client eo_client = lo_client
ev_branch = ev_branch ). ev_branch = ev_branch ).
IF it_branches IS INITIAL. IF it_branches IS INITIAL.
@ -379,9 +332,8 @@ CLASS lcl_git_transport IMPLEMENTATION.
lt_branches = it_branches. lt_branches = it_branches.
ENDIF. ENDIF.
set_headers( iv_url = io_repo->get_url( ) lo_client->set_headers( iv_url = io_repo->get_url( )
iv_service = c_service-upload iv_service = c_service-upload ).
ii_client = li_client ).
LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>. LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>.
IF sy-tabix = 1. IF sy-tabix = 1.
@ -403,12 +355,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
&& '0000' && '0000'
&& '0009done' && gc_newline. && '0009done' && gc_newline.
* do not use set_cdata as it modifies the Content-Type header field lv_xstring = lo_client->send_receive_close( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ).
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( ).
parse( IMPORTING ev_pack = lv_pack parse( IMPORTING ev_pack = lv_pack
CHANGING cv_data = lv_xstring ). CHANGING cv_data = lv_xstring ).

View File

@ -2,6 +2,153 @@
*& Include ZABAPGIT_HTTP *& 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. CLASS lcl_http_digest DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
@ -95,14 +242,14 @@ CLASS lcl_http_digest IMPLEMENTATION.
iv_qop = lv_qop iv_qop = lv_qop
iv_realm = lv_realm iv_realm = lv_realm
iv_nonce = lv_nonce iv_nonce = lv_nonce
iv_username = p_user iv_username = iv_username
iv_uri = lv_uri iv_uri = lv_uri
iv_method = lv_method iv_method = lv_method
iv_cnonse = lv_cnonce iv_cnonse = lv_cnonce
iv_password = p_pass ). iv_password = iv_password ).
* client response * client response
lv_auth = |Digest username="{ p_user lv_auth = |Digest username="{ iv_username
}", realm="{ lv_realm }", realm="{ lv_realm
}", nonce="{ lv_nonce }", nonce="{ lv_nonce
}", uri="{ lv_uri }", uri="{ lv_uri
@ -165,18 +312,12 @@ CLASS lcl_http DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
CLASS-METHODS: 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 get_agent
RETURNING VALUE(rv_agent) TYPE string, RETURNING VALUE(rv_agent) TYPE string,
create_by_url create_by_url
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
iv_service 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. RAISING lcx_exception.
PRIVATE SECTION. PRIVATE SECTION.
@ -208,6 +349,7 @@ CLASS lcl_http IMPLEMENTATION.
DATA: lv_uri TYPE string, DATA: lv_uri TYPE string,
lv_expect_potentual_auth TYPE abap_bool, lv_expect_potentual_auth TYPE abap_bool,
li_client TYPE REF TO if_http_client,
lo_settings TYPE REF TO lcl_settings. lo_settings TYPE REF TO lcl_settings.
@ -220,43 +362,47 @@ CLASS lcl_http IMPLEMENTATION.
proxy_host = lo_settings->get_proxy_url( ) proxy_host = lo_settings->get_proxy_url( )
proxy_service = lo_settings->get_proxy_port( ) proxy_service = lo_settings->get_proxy_port( )
IMPORTING IMPORTING
client = ri_client ). client = li_client ).
CREATE OBJECT ro_client
EXPORTING
ii_client = li_client.
IF is_local_system( iv_url ) = abap_true. IF is_local_system( iv_url ) = abap_true.
ri_client->send_sap_logon_ticket( ). li_client->send_sap_logon_ticket( ).
ENDIF. ENDIF.
ri_client->request->set_cdata( '' ). li_client->request->set_cdata( '' ).
ri_client->request->set_header_field( li_client->request->set_header_field(
name = '~request_method' name = '~request_method'
value = 'GET' ). value = 'GET' ).
ri_client->request->set_header_field( li_client->request->set_header_field(
name = 'user-agent' name = 'user-agent'
value = get_agent( ) ). "#EC NOTEXT value = get_agent( ) ). "#EC NOTEXT
lv_uri = lcl_url=>path_name( iv_url ) && lv_uri = lcl_url=>path_name( iv_url ) &&
'/info/refs?service=git-' && '/info/refs?service=git-' &&
iv_service && iv_service &&
'-pack'. '-pack'.
ri_client->request->set_header_field( li_client->request->set_header_field(
name = '~request_uri' name = '~request_uri'
value = lv_uri ). value = lv_uri ).
" Disable internal auth dialog (due to its unclarity) " 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 lcl_login_manager=>load( iv_uri = iv_url
ii_client = ri_client ). ii_client = li_client ).
send_receive( ri_client ). ro_client->send_receive( ).
IF check_auth_requested( ri_client ) = abap_true. IF check_auth_requested( li_client ) = abap_true.
acquire_login_details( ii_client = ri_client acquire_login_details( ii_client = li_client
iv_url = iv_url ). iv_url = iv_url ).
send_receive( ri_client ). ro_client->send_receive( ).
ENDIF. ENDIF.
check_http_200( ri_client ). ro_client->check_http_200( ).
lcl_login_manager=>save( iv_uri = iv_url lcl_login_manager=>save( iv_uri = iv_url
ii_client = ri_client ). ii_client = li_client ).
ENDMETHOD. ENDMETHOD.
@ -286,37 +432,6 @@ CLASS lcl_http IMPLEMENTATION.
ENDMETHOD. 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. METHOD check_auth_requested.
DATA: lv_code TYPE i. DATA: lv_code TYPE i.
@ -377,33 +492,4 @@ CLASS lcl_http IMPLEMENTATION.
ENDMETHOD. "acquire_login_details 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. ENDCLASS.