J'ai un web-frontend mercurial (hgwebdir.cgi) installé sur un serveur, et une installation de nginx a été installée en face de celui-ci comme un reverse proxy vers le web-frontend comme l'a suggéré mon ami. Cependant, chaque fois qu'un grand jeu de modifications est poussé (via un script), il échoue. J'ai trouvé un ticket de problème @google-code qui décrivent un problème similaire, et il y a une solution qui dit (#39)
La réponse côté serveur est donc la suivante : ne pas renvoyer le 401 plus tôt. Soyez aussi lent/imbécile que 'hg serve' et faites en sorte que le client hg envoie le bundle deux fois.
Comment faire ? Ma configuration actuelle de nginx
location /repo/testdomain.com {
rewrite ^(.*) http://bpj.kkr.gov.my$1/hgwebdir.cgi;
}
location /repo/testdomain.com/ {
rewrite ^(.*) http://bpj.kkr.gov.my$1hgwebdir.cgi;
}
location /repo/testdomain.com/hgwebdir.cgi {
proxy_pass http://localhost:81/repo/testdomain.com/hgwebdir.cgi;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
client_max_body_size 4096M;
proxy_read_timeout 30000;
proxy_send_timeout 30000;
}
Dans le journal d'accès, nous voyons toujours 408 entrées
incoming.ip.address - - [18/Nov/2009:08:29:31 +0800] "POST /repo/testdomain.com/hgwebdir.cgi/example_repository?cmd=unbundle&heads=73121b2b6159afc47cc3a028060902883d5b1e74 HTTP/1.1" 408 0 "-" "mercurial/proto-1.0"
incoming.ip.address - - [18/Nov/2009:08:37:14 +0800] "POST /repo/testdomain.com/hgwebdir.cgi/example_repository?cmd=unbundle&heads=73121b2b6159afc47cc3a028060902883d5b1e74 HTTP/1.1" 408 0 "-" "mercurial/proto-1.0"
Y a-t-il autre chose que je puisse faire sur le serveur car il est préférable de résoudre le problème du côté du serveur :/
Autres conclusions
Bitbucket semble avoir résolu ce problème (voir le projet liquidhg bitbucket et la page wiki Diagnosis) côté serveur, mais je ne trouve la configuration nulle part :/
- Ce qui se passe ensuite varie en fonction de votre serveur. Certains serveurs refusent le BODY, fermant simplement le tuyau du client et du client et provoquent l'échec de Mercurial échoue. D'autres, comme Apache (du moins tel que je le configure), et cela pourrait être une partie du problème) et nginx (la façon dont BitBucket.org le configure), acceptent le BODY acceptent le BODY, bien que cela puisse prendre quelques tentatives. Conclusion : si Mercurial n'échoue pas le push, il envoie le changeset au moins une fois à un serveur qui lui a déjà dit qu'il manque d'informations d'identification (plus d'informations à ce sujet à Blame).
- En supposant que Mercurial fonctionne toujours, il renvoie la demande de "dégroupage" et les données et les données, cette fois avec l'authentification.
- Enfin, Apache accepte les données avec succès. Nginx, quant à lui, au moins dans la configuration de BitBucket, semble réassembler les données (celui qui n'avait pas d'authentification ) et empêcher d'une manière ou d'une autre Mercurial de renvoyer l'ensemble du entier.