Linux
Programming
Misc
Linux
Programming
Misc
FUNCTION z_http_property_set. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(URI) TYPE STRING *" VALUE(PROP_NAME) TYPE STRING OPTIONAL *" VALUE(PROP_VALUE) TYPE STRING OPTIONAL *" EXPORTING *" VALUE(CODE) TYPE I *" VALUE(REASON) TYPE STRING *" TABLES *" TAB_PROP STRUCTURE SMUM_XMLTB OPTIONAL *" EXCEPTIONS *" NO_LOGIN_ACCOUNT_AVAILABLE *" HTTP_COMMUNICATION_FAILURE *" HTTP_INVALID_STATE *" HTTP_PROCESSING_FAILED *"---------------------------------------------------------------------- * Proof of Concept by IperCube 2007 *"---------------------------------------------------------------------- DATA: user TYPE string, pwd TYPE string, x_bytes TYPE i. * Set User/Password Logon to web server user = 'my_user'. pwd = 'my_password'. * Translate URL TRANSLATE uri USING ' *'. REPLACE ALL OCCURRENCES OF '*' IN uri WITH '%20' IN CHARACTER MODE. ****************************************************************** * Build XML request ****************************************************************** DATA: xml_table TYPE TABLE OF smum_xmltb, wa_xml_table TYPE smum_xmltb, xml_output TYPE string. wa_xml_table-hier = 1. wa_xml_table-type = 'V'. wa_xml_table-cname = 'propertyupdate'. wa_xml_table-cvalue = ''. APPEND wa_xml_table TO xml_table. wa_xml_table-hier = 1. wa_xml_table-type = 'A'. wa_xml_table-cname = 'xmlns'. wa_xml_table-cvalue = 'DAV:'. APPEND wa_xml_table TO xml_table. * wa_xml_table-hier = 1. * wa_xml_table-type = 'A'. * wa_xml_table-cname = 'depth'. * wa_xml_table-cvalue = '0'. * APPEND wa_xml_table TO xml_table. wa_xml_table-hier = 2. wa_xml_table-type = 'V'. wa_xml_table-cname = 'set'. wa_xml_table-cvalue = ''. APPEND wa_xml_table TO xml_table. wa_xml_table-hier = 3. wa_xml_table-type = 'V'. wa_xml_table-cname = 'prop'. wa_xml_table-cvalue = ''. APPEND wa_xml_table TO xml_table. wa_xml_table-hier = 4. wa_xml_table-type = 'V'. * Check for Single Propriety IF prop_name IS NOT INITIAL. wa_xml_table-cname = prop_name. wa_xml_table-cvalue = prop_value. APPEND wa_xml_table TO xml_table. ENDIF. * Check for Many Proprieties IF tab_prop[] IS NOT INITIAL. DATA wa_prop TYPE smum_xmltb. LOOP AT tab_prop INTO wa_prop. wa_xml_table-cname = wa_prop-cname. wa_xml_table-cvalue = wa_prop-cvalue. APPEND wa_xml_table TO xml_table. ENDLOOP. ENDIF. * Create XML CALL FUNCTION 'SMUM_XML_CREATE' IMPORTING xml_output = xml_output TABLES xml_table = xml_table. ****************************************************************** * Set Properties via HTTP ****************************************************************** * Create HTTP_CLIENT object DATA: client TYPE REF TO if_http_client, timeout TYPE i VALUE 0. CALL METHOD cl_http_client=>create_by_url EXPORTING url = uri IMPORTING client = client. * Authentication CALL METHOD client->authenticate EXPORTING * PROXY_AUTHENTICATION = ' ' * CLIENT = sy-mandt username = user password = pwd * LANGUAGE = 'E'. * Set Header Fields - method PROPPATCH CALL METHOD client->request->set_header_field EXPORTING name = '~request_method' value = 'PROPPATCH'. CALL METHOD client->request->set_header_field EXPORTING name = '~server_protocol' value = 'HTTP/1.1'. CALL METHOD client->request->set_header_field EXPORTING name = 'depth' value = 'infinity'. CALL METHOD client->request->set_header_field EXPORTING name = 'content-type' value = 'text/xml'. x_bytes = STRLEN( xml_output ). CALL METHOD client->request->set_cdata EXPORTING data = xml_output length = x_bytes. * send and receive with HTTP server CALL METHOD client->send EXPORTING timeout = timeout EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 OTHERS = 4. CASE sy-subrc. WHEN 1. RAISE http_communication_failure. WHEN 2. RAISE http_invalid_state. WHEN 3. RAISE http_processing_failed. ** WHEN 4. RAISE others. ENDCASE. CALL METHOD client->receive EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 OTHERS = 4. CASE sy-subrc. WHEN 1. RAISE http_communication_failure. WHEN 2. RAISE http_invalid_state. WHEN 3. RAISE http_processing_failed. ** WHEN 4. RAISE others. ENDCASE. * Get XML - just for fun DATA: xml_return TYPE string. xml_return = client->response->get_cdata( ). * Get Global Status CALL METHOD client->response->get_status IMPORTING code = code reason = reason. * close connection CALL METHOD client->close EXCEPTIONS http_invalid_state = 1 OTHERS = 2. ENDFUNCTION.