fix: 런처 안정성 개선 (4건)
- ticket JSON 직렬화 json.Marshal 사용 (특수문자 안전) - 4xx 에러 메시지 "서버 오류"→"요청 실패" 수정 - 자동 업데이트 실패 시 stderr 로깅 추가 - 서버 URL을 ldflags로 오버라이드 가능하도록 var 전환 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2
main.go
2
main.go
@@ -73,7 +73,7 @@ func handleURI(rawURI string) error {
|
|||||||
|
|
||||||
// 런처 자동 업데이트 체크
|
// 런처 자동 업데이트 체크
|
||||||
if updated, updateErr := ensureLauncher(serverInfo); updateErr != nil {
|
if updated, updateErr := ensureLauncher(serverInfo); updateErr != nil {
|
||||||
_ = updateErr // 업데이트 실패는 치명적이지 않음
|
fmt.Fprintf(os.Stderr, "런처 업데이트 실패: %v\n", updateErr)
|
||||||
} else if updated {
|
} else if updated {
|
||||||
cmd := exec.Command(os.Args[0], os.Args[1:]...)
|
cmd := exec.Command(os.Args[0], os.Args[1:]...)
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
|
|||||||
17
protocol.go
17
protocol.go
@@ -15,8 +15,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
protocolName = "a301"
|
protocolName = "a301"
|
||||||
gameExeName = "A301.exe"
|
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"
|
serverInfoURL = "https://a301.api.tolelom.xyz/api/download/info"
|
||||||
redeemTicketURL = "https://a301.api.tolelom.xyz/api/auth/redeem-ticket"
|
redeemTicketURL = "https://a301.api.tolelom.xyz/api/auth/redeem-ticket"
|
||||||
)
|
)
|
||||||
@@ -122,7 +127,7 @@ func fetchServerInfoOnce() (*downloadInfo, error) {
|
|||||||
return nil, &errNoRetry{fmt.Errorf("게임이 아직 준비되지 않았습니다")}
|
return nil, &errNoRetry{fmt.Errorf("게임이 아직 준비되지 않았습니다")}
|
||||||
}
|
}
|
||||||
if resp.StatusCode >= 400 {
|
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
|
var info downloadInfo
|
||||||
@@ -157,7 +162,11 @@ func redeemTicket(ticket string) (string, error) {
|
|||||||
|
|
||||||
func redeemTicketFrom(url, ticket string) (string, error) {
|
func redeemTicketFrom(url, ticket string) (string, error) {
|
||||||
client := &http.Client{Timeout: 10 * time.Second}
|
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))
|
resp, err := client.Post(url, "application/json", strings.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("서버에 연결할 수 없습니다: %w", err)
|
return "", fmt.Errorf("서버에 연결할 수 없습니다: %w", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user