From d670b7a27b55dfac6ddd426a4e8b27978d5c1364 Mon Sep 17 00:00:00 2001 From: Habu Date: Sun, 11 Mar 2018 00:07:02 +0900 Subject: [PATCH] =?utf8?q?=E3=82=B9=E3=82=B3=E3=82=A2=E3=82=B5=E3=83=BC?= =?utf8?q?=E3=83=90=E3=81=AEOSDN=E7=A7=BB=E8=A8=AD=E3=81=AB=E4=BC=B4?= =?utf8?q?=E3=81=86=E3=82=B5=E3=83=BC=E3=83=90=E3=82=A2=E3=83=89=E3=83=AC?= =?utf8?q?=E3=82=B9=E3=83=BBURL=E3=81=AE=E5=A4=89=E6=9B=B4=20=E5=8A=A0?= =?utf8?q?=E3=81=88=E3=81=A6=E3=82=B5=E3=83=BC=E3=83=90=E3=81=8B=E3=82=89?= =?utf8?q?=E3=81=AE=E3=83=AC=E3=82=B9=E3=83=9D=E3=83=B3=E3=82=B9=E3=82=B3?= =?utf8?q?=E3=83=BC=E3=83=89=E3=81=A7=E9=80=81=E4=BF=A1=E5=A4=B1=E6=95=97?= =?utf8?q?=E3=81=AE=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=92=E8=A1=8C?= =?utf8?q?=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/externs.h | 1 + src/inet.c | 25 ++++++++++++++++ src/report.c | 95 +++++++++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 95 insertions(+), 26 deletions(-) diff --git a/src/externs.h b/src/externs.h index 0203bbca9..3c7582809 100644 --- a/src/externs.h +++ b/src/externs.h @@ -1770,6 +1770,7 @@ extern cptr make_screen_dump(void); /* inet.c */ extern int soc_write(int sd, char *buf, size_t sz); +extern int soc_read(int sd, char *buf, size_t sz); extern void set_proxy(char *default_url, int default_port); extern int connect_server(int timeout, const char *host, int port); extern int disconnect_server(int sd); diff --git a/src/inet.c b/src/inet.c index 1bcec65f9..5c5288069 100644 --- a/src/inet.c +++ b/src/inet.c @@ -211,6 +211,31 @@ int soc_write(int sd, char *buf, size_t sz) return sz; } +int soc_read(int sd, char *buf, size_t sz) +{ +#ifndef MACINTOSH + int nleft, nread = 0; + + nleft = sz; + + while (nleft > 0) { + int n; + n = recv(sd, buf + nread, nleft, 0); + if (n <= 0) + return (nread); + nleft -= n; + nread += n; + } +#else /* !MACINTOSH */ + + OTResult bytesSent; + + OTSnd(ep, (void *)buf, sz, 0); + +#endif + return nread; +} + #if 0 /* おそらく使わない */ int soc_write_str(int sd, char *buf) { diff --git a/src/report.c b/src/report.c index 7517652bf..7d9bf83e4 100644 --- a/src/report.c +++ b/src/report.c @@ -37,11 +37,11 @@ #define HTTP_PROXY "" /*!< デフォルトのプロキシURL / Default proxy url */ #define HTTP_PROXY_PORT 0 /*!< デフォルトのプロキシポート / Default proxy port */ #define HTTP_TIMEOUT 20 /*!< デフォルトのタイムアウト時間(秒) / Timeout length (second) */ -#define SCORE_SERVER "moon.kmc.gr.jp" /*!< デフォルトのスコアサーバURL / Default score server url */ +#define SCORE_SERVER "hengband.osdn.jp" /*!< デフォルトのスコアサーバURL / Default score server url */ #define SCORE_PORT 80 /*!< デフォルトのスコアサーバポート / Default score server port */ #ifdef JP -#define SCORE_PATH "http://moon.kmc.gr.jp/hengband/hengscore/score.cgi" /*!< スコア開示URL */ +#define SCORE_PATH "http://hengband.osdn.jp/score/register_score.php" /*!< スコア開示URL */ #else #define SCORE_PATH "http://moon.kmc.gr.jp/hengband/hengscore-en/score.cgi" /*!< スコア開示URL */ #endif @@ -228,22 +228,37 @@ static BUF * buf_subbuf(BUF *buf, int pos1, size_t sz) * @param buf 伝送内容バッファ * @return なし */ -static void http_post(int sd, cptr url, BUF *buf) +static bool http_post(int sd, cptr url, BUF *buf) { BUF *output; + char response_buf[1024] = ""; + const char *HTTP_RESPONSE_CODE_OK = "HTTP/1.1 200 OK"; output = buf_new(); - buf_sprintf(output, "POST %s HTTP/1.0\n", url); - buf_sprintf(output, "User-Agent: Hengband %d.%d.%d\n", + buf_sprintf(output, "POST %s HTTP/1.0\r\n", url); + buf_sprintf(output, "User-Agent: Hengband %d.%d.%d\r\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); - buf_sprintf(output, "Content-Length: %d\n", buf->size); - buf_sprintf(output, "Content-Encoding: binary\n"); - buf_sprintf(output, "Content-Type: application/octet-stream\n"); - buf_sprintf(output, "\n"); + buf_sprintf(output, "Content-Length: %d\r\n", buf->size); + buf_sprintf(output, "Content-Encoding: binary\r\n"); +#ifdef JP +#ifdef SJIS + buf_sprintf(output, "Content-Type: text/plain; charset=SHIFT_JIS\r\n"); +#endif +#ifdef EUC + buf_sprintf(output, "Content-Type: text/plain; charset=EUC-JP\r\n"); +#endif +#else + buf_sprintf(output, "Content-Type: text/plain; charset=ASCII\r\n"); +#endif + buf_sprintf(output, "\r\n"); buf_append(output, buf->data, buf->size); soc_write(sd, output->data, output->size); + + soc_read(sd, response_buf, sizeof(response_buf)); + + return strncmp(response_buf, HTTP_RESPONSE_CODE_OK, strlen(HTTP_RESPONSE_CODE_OK)) == 0; } /*! @@ -524,34 +539,62 @@ errr report_score(void) sd = connect_server(HTTP_TIMEOUT, SCORE_SERVER, SCORE_PORT); - if (!(sd < 0)) break; + if (sd < 0) { #ifdef JP - sprintf(buff, "スコア・サーバへの接続に失敗しました。(%s)", soc_err()); + sprintf(buff, "スコア・サーバへの接続に失敗しました。(%s)", soc_err()); #else - sprintf(buff, "Failed to connect to the score server.(%s)", soc_err()); + sprintf(buff, "Failed to connect to the score server.(%s)", soc_err()); #endif - prt(buff, 0, 0); - (void)inkey(); - + prt(buff, 0, 0); + (void)inkey(); + #ifdef JP - if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) + if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) #else - if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) + if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) #endif - { - err = 1; - goto report_end; + { + err = 1; + goto report_end; + } + + continue; } - } + #ifdef JP - prt("スコア送信中...", 0, 0); + prt("スコア送信中...", 0, 0); #else - prt("Sending the score...", 0, 0); + prt("Sending the score...", 0, 0); #endif - Term_fresh(); - http_post(sd, SCORE_PATH, score); + Term_fresh(); + + if (!http_post(sd, SCORE_PATH, score)) { + disconnect_server(sd); +#ifdef JP + sprintf(buff, "スコア・サーバへの送信に失敗しました。"); +#else + sprintf(buff, "Failed to send to the score server."); +#endif + prt(buff, 0, 0); + (void)inkey(); + +#ifdef JP + if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) +#else + if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) +#endif + { + err = 1; + goto report_end; + } + + continue; + } + + disconnect_server(sd); + break; + } - disconnect_server(sd); report_end: #ifdef WINDOWS WSACleanup(); -- 2.11.0