From b026520b35b27bd0def1257d819f1f2f2d2ed567 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Wed, 18 Mar 2026 23:26:41 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=9F=B0=EC=B2=98=20=EC=95=88=EC=A0=95?= =?UTF-8?q?=EC=84=B1=20=EA=B0=9C=EC=84=A0=20(4=EA=B1=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ticket JSON 직렬화 json.Marshal 사용 (특수문자 안전) - 4xx 에러 메시지 "서버 오류"→"요청 실패" 수정 - 자동 업데이트 실패 시 stderr 로깅 추가 - 서버 URL을 ldflags로 오버라이드 가능하도록 var 전환 Co-Authored-By: Claude Opus 4.6 (1M context) --- main.go | 2 +- protocol.go | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index fdf5751..8c2d0a7 100644 --- a/main.go +++ b/main.go @@ -73,7 +73,7 @@ func handleURI(rawURI string) error { // 런처 자동 업데이트 체크 if updated, updateErr := ensureLauncher(serverInfo); updateErr != nil { - _ = updateErr // 업데이트 실패는 치명적이지 않음 + fmt.Fprintf(os.Stderr, "런처 업데이트 실패: %v\n", updateErr) } else if updated { cmd := exec.Command(os.Args[0], os.Args[1:]...) if err := cmd.Start(); err != nil { diff --git a/protocol.go b/protocol.go index ae840d8..5cd370b 100644 --- a/protocol.go +++ b/protocol.go @@ -15,8 +15,13 @@ import ( ) const ( - protocolName = "a301" - gameExeName = "A301.exe" + protocolName = "a301" + gameExeName = "A301.exe" +) + +// serverInfoURL and redeemTicketURL can be overridden at build time via +// -ldflags "-X main.serverInfoURL=... -X main.redeemTicketURL=..." +var ( serverInfoURL = "https://a301.api.tolelom.xyz/api/download/info" redeemTicketURL = "https://a301.api.tolelom.xyz/api/auth/redeem-ticket" ) @@ -122,7 +127,7 @@ func fetchServerInfoOnce() (*downloadInfo, error) { return nil, &errNoRetry{fmt.Errorf("게임이 아직 준비되지 않았습니다")} } if resp.StatusCode >= 400 { - return nil, &errNoRetry{fmt.Errorf("서버 오류 (HTTP %d)", resp.StatusCode)} + return nil, &errNoRetry{fmt.Errorf("요청 실패 (HTTP %d)", resp.StatusCode)} } var info downloadInfo @@ -157,7 +162,11 @@ func redeemTicket(ticket string) (string, error) { func redeemTicketFrom(url, ticket string) (string, error) { client := &http.Client{Timeout: 10 * time.Second} - body := fmt.Sprintf(`{"ticket":"%s"}`, ticket) + payload, err := json.Marshal(map[string]string{"ticket": ticket}) + if err != nil { + return "", fmt.Errorf("요청 데이터 생성 실패: %w", err) + } + body := string(payload) resp, err := client.Post(url, "application/json", strings.NewReader(body)) if err != nil { return "", fmt.Errorf("서버에 연결할 수 없습니다: %w", err)