Ejudge CGI под Nginx

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
yun_man_ger
Posts:32
Joined:27 September 2010, 07:37
Re: Ejudge CGI под Nginx

Post by yun_man_ger » 17 May 2012, 23:14

Хехе! Ответ тут

Code: Select all

  client_put_refresh_header(config->charset, buf, 0, "Login successfull");
  printf("<p>%s</p>", _("Login successfull. Now entering the main page."));
  printf("<p>If automatic updating does not work, click on <a href=\"%s\">this</a> link.</p>", buf);
Точнее в функции client_put_refresh_header

Code: Select all

static void
client_put_refresh_header(unsigned char const *coding,
                          unsigned char const *url,
                          int interval,
                          unsigned char const *format, ...)
{
  /*
  va_list args;

  if (!coding) coding = DEFAULT_CHARSET;

  va_start(args, format);
  fprintf(stdout, "Content-Type: text/html; charset=%s\nCache-Control: no-cache\nPragma: no-cache\n\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"><meta http-equiv=\"Refresh\" content=\"%d; url=%s\"><title>\n", coding, coding, interval, url);
  vfprintf(stdout, format, args);
  fputs("\n</title></head><body><h1>\n", stdout);
  vfprintf(stdout, format, args);
  fputs("\n</h1>\n", stdout);
  */
  printf("Content-Type: text/html; charset=%s\nCache-Control: no-cache\nPragma: no-cache\nLocation: %s\n\n", EJUDGE_CHARSET, url);
}
Часть с редайректом закомментирована. в том же RFC http://tools.ietf.org/html/rfc3875#section-6.2.2 по CGI говорится, что при редайрект надо просто возвращать
Location header


Переписал функцию вот так и редайрект починился.

Code: Select all

  
static void
client_put_refresh_header(unsigned char const *coding,
                          unsigned char const *url,
                          int interval,
                          unsigned char const *format, ...)
{
  printf("Location: %s\n\n", url);
}

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 17 May 2012, 23:31

При запросе на new-master по URL http://localhost:8080/new-master?SID=13 ... 1&action=3 получаю пустоту.

В логах выписывается при этом

ej-users.log
Fri May 18 02:26:52 2012:info:PRIV_COOKIE_LOGIN: 127.0.0.1, 0, 1, 133836515e1aea57 -> OK, 1, e6924539d957453a
ej-contests.log
Fri May 18 02:26:52 2012:info:15: received 2 file descriptors: 6, 7
Fri May 18 02:26:52 2012:info:HTTP_REQUEST -> OK, 154

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 18 May 2012, 10:19

Я исправил все места, где генерируется Location:.
Попробуйте проверить, возможно сейчас и new-server заработает.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 18 May 2012, 11:31

Отлично. Заработало.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 08 December 2012, 13:27

Здравствуйте.

Я обнаружил еще одну проблему. В некоторых случаях переменная CONTENT_LENGTH не указывается, и тогда
cgi скрипт зависает так как content_length по умолчянию равен MAX_INT. Все работает если по умолчанию указывать значение 0.

http://ejudge.ru/trac/browser/trunk/ejudge/cgi.c#L63

Я проверил просто заменив MAX_INT на 0, но возможно стоит делать проверку именно отсутствия переменной CONTENT_LENGTH.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 08 December 2012, 21:10

В каких случаях? Можете привести сценарий, как возпроизвести?

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 08 December 2012, 22:14

uWSGI делает так. http://projects.unbit.it/uwsgi/wiki/CGI


При GET запросе CONTENT_LENGTH не передается.

В RFC говорится, что CONTENT_LENGTH указывается когда есть message-body. А иначе можно не указывать.
If no data are attached, then this metavariable is not defined.
http://www.rfc-editor.org/rfc/rfc3050.txt Раздел: 5.5.1.2 CONTENT_LENGTH

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 09 December 2012, 12:27

спасибо
исправлю

Post Reply