From d448d2597a5f01b45d1f8e03e2e46ba82231da74 Mon Sep 17 00:00:00 2001 From: johnnyshields <27655+johnnyshields@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:19:32 +0900 Subject: [PATCH] net-http 0.7.0+ requires to explicitly setting content type --- lib/gmo/http_services.rb | 3 +- spec/gmo/net_http_service_spec.rb | 88 +++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 spec/gmo/net_http_service_spec.rb diff --git a/lib/gmo/http_services.rb b/lib/gmo/http_services.rb index c0cd78b..a2918eb 100644 --- a/lib/gmo/http_services.rb +++ b/lib/gmo/http_services.rb @@ -44,7 +44,8 @@ def self.make_request(path, args, verb, options = {}) headers = { "Content-Type" => "application/json" } h.post(path, args.to_json, headers) else - h.post(path, encode_params(args)) + headers = { "Content-Type" => "application/x-www-form-urlencoded" } + h.post(path, encode_params(args), headers) end else h.get("#{path}?#{encode_params(args)}") diff --git a/spec/gmo/net_http_service_spec.rb b/spec/gmo/net_http_service_spec.rb new file mode 100644 index 0000000..7c8d7ca --- /dev/null +++ b/spec/gmo/net_http_service_spec.rb @@ -0,0 +1,88 @@ +require 'spec_helper' + +class FakeNetHTTPService + include GMO::NetHTTPService +end + +describe "GMO::NetHTTPService" do + + describe "#make_request" do + let(:mock_http) { double("Net::HTTP") } + let(:mock_http_session) { double("Net::HTTP session") } + let(:mock_response) { double("Net::HTTPResponse", code: "200", body: "AccessID=test123") } + + before do + allow(Net::HTTP).to receive(:new).and_return(mock_http) + allow(mock_http).to receive(:use_ssl=) + allow(mock_http).to receive(:start).and_yield(mock_http_session) + end + + describe "Content-Type header for form-encoded POST requests" do + it "sets Content-Type to application/x-www-form-urlencoded" do + expect(mock_http_session).to receive(:post) do |path, body, headers| + expect(path).to eq("/payment/EntryTran.idPass") + expect(headers["Content-Type"]).to eq("application/x-www-form-urlencoded") + mock_response + end + + FakeNetHTTPService.make_request( + "/payment/EntryTran.idPass", + { "ShopID" => "shop123", "OrderID" => "order456" }, + "post", + { :host => "example.com" } + ) + end + + it "properly encodes form parameters" do + expect(mock_http_session).to receive(:post) do |path, body, headers| + expect(path).to eq("/payment/EntryTran.idPass") + expect(body).to include("ShopID=") + expect(body).to include("OrderID=") + expect(headers["Content-Type"]).to eq("application/x-www-form-urlencoded") + mock_response + end + + FakeNetHTTPService.make_request( + "/payment/EntryTran.idPass", + { "ShopID" => "shop123", "OrderID" => "order456" }, + "post", + { :host => "example.com" } + ) + end + end + + describe "Content-Type header for JSON POST requests" do + it "sets Content-Type to application/json for .json paths" do + expect(mock_http_session).to receive(:post) do |path, body, headers| + expect(path).to eq("/payment/EntryTran.json") + expect(headers["Content-Type"]).to eq("application/json") + mock_response + end + + FakeNetHTTPService.make_request( + "/payment/EntryTran.json", + { "ShopID" => "shop123" }, + "post", + { :host => "example.com" } + ) + end + end + + describe "GET requests" do + it "appends parameters to query string without Content-Type header" do + expect(mock_http_session).to receive(:get) do |path_with_query| + expect(path_with_query).to include("/payment/SearchTrade.idPass?") + expect(path_with_query).to include("ShopID=") + mock_response + end + + FakeNetHTTPService.make_request( + "/payment/SearchTrade.idPass", + { "ShopID" => "shop123" }, + "get", + { :host => "example.com" } + ) + end + end + end +end