class IDRAC::Session
def create_session_with_form_urlencoded(url, payload)
def create_session_with_form_urlencoded(url, payload) # Only try with form-urlencoded if we had a 415 error previously begin debug "Trying with form-urlencoded content type", 1 debug "URL: #{base_url}#{url}", 1 # Try first without any authorization header response = connection.post(url) do |req| req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.headers['Accept'] = '*/*' req.headers['Host'] = host_header if host_header req.body = "UserName=#{URI.encode_www_form_component(username)}&Password=#{URI.encode_www_form_component(password)}" debug "Request headers: #{req.headers.reject { |k,v| k =~ /auth/i }.to_json}", 2 end debug "Response status: #{response.status}", 1 debug "Response headers: #{response.headers.to_json}", 2 debug "Response body: #{response.body}", 3 if process_session_response(response) debug "Redfish session created successfully with form-urlencoded", 1, :green return true end # If that fails, try with Basic Auth + form-urlencoded debug "Trying form-urlencoded with Basic Auth", 1 auth_response = request_with_basic_auth(:post, url, "UserName=#{URI.encode_www_form_component(username)}&Password=#{URI.encode_www_form_component(password)}", 'application/x-www-form-urlencoded') if process_session_response(auth_response) debug "Redfish session created successfully with form-urlencoded + Basic Auth", 1, :green return true end # Last resort: try with both headers (some iDRAC versions need this) debug "Trying with both Content-Type headers", 1 both_response = connection.post(url) do |req| req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.headers['Accept'] = 'application/json' req.headers['X-Requested-With'] = 'XMLHttpRequest' req.headers['Authorization'] = "Basic #{Base64.strict_encode64("#{username}:#{password}")}" req.headers['Host'] = host_header if host_header req.body = "UserName=#{URI.encode_www_form_component(username)}&Password=#{URI.encode_www_form_component(password)}" end if process_session_response(both_response) debug "Redfish session created successfully with multiple content types", 1, :green return true else debug "Failed with form-urlencoded too: #{response.status} - #{response.body}", 1, :red return false end rescue Faraday::SSLError => e debug "SSL Error in form-urlencoded request: #{e.message}", 1, :red debug "OpenSSL version: #{OpenSSL::OPENSSL_VERSION}", 1 debug "Connection URL: #{base_url}#{url}", 1 debug e.backtrace.join("\n"), 3 if e.backtrace && @verbosity >= 3 return false rescue => e debug "Error during form-urlencoded session creation: #{e.class.name}: #{e.message}", 1, :red debug e.backtrace.join("\n"), 2 if e.backtrace && @verbosity >= 2 return false end end