331 s> 0\r\n |
331 s> 0\r\n |
332 s> \r\n |
332 s> \r\n |
333 response: [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'] |
333 response: [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'] |
334 |
334 |
335 $ killdaemons.py |
335 $ killdaemons.py |
|
336 |
|
337 HTTP client follows HTTP redirect on handshake to new repo |
|
338 |
|
339 $ cd $TESTTMP |
|
340 |
|
341 $ hg init redirector |
|
342 $ hg init redirected |
|
343 $ cd redirected |
|
344 $ touch foo |
|
345 $ hg -q commit -A -m initial |
|
346 $ cd .. |
|
347 |
|
348 $ cat > paths.conf << EOF |
|
349 > [paths] |
|
350 > / = $TESTTMP/* |
|
351 > EOF |
|
352 |
|
353 $ cat > redirectext.py << EOF |
|
354 > from mercurial import extensions, wireprotoserver |
|
355 > def wrappedcallhttp(orig, repo, req, res, proto, cmd): |
|
356 > path = req.advertisedurl[len(req.advertisedbaseurl):] |
|
357 > if not path.startswith(b'/redirector'): |
|
358 > return orig(repo, req, res, proto, cmd) |
|
359 > relpath = path[len(b'/redirector'):] |
|
360 > res.status = b'301 Redirect' |
|
361 > newurl = b'%s/redirected%s' % (req.baseurl, relpath) |
|
362 > if not repo.ui.configbool('testing', 'redirectqs', True) and b'?' in newurl: |
|
363 > newurl = newurl[0:newurl.index(b'?')] |
|
364 > res.headers[b'Location'] = newurl |
|
365 > res.headers[b'Content-Type'] = b'text/plain' |
|
366 > res.setbodybytes(b'redirected') |
|
367 > return True |
|
368 > |
|
369 > extensions.wrapfunction(wireprotoserver, '_callhttp', wrappedcallhttp) |
|
370 > EOF |
|
371 |
|
372 $ hg --config extensions.redirect=$TESTTMP/redirectext.py \ |
|
373 > --config server.compressionengines=zlib \ |
|
374 > serve --web-conf paths.conf --pid-file hg.pid -p $HGPORT -d |
|
375 $ cat hg.pid > $DAEMON_PIDS |
|
376 |
|
377 Verify our HTTP 301 is served properly |
|
378 |
|
379 $ hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT << EOF |
|
380 > httprequest GET /redirector?cmd=capabilities |
|
381 > user-agent: test |
|
382 > EOF |
|
383 using raw connection to peer |
|
384 s> GET /redirector?cmd=capabilities HTTP/1.1\r\n |
|
385 s> Accept-Encoding: identity\r\n |
|
386 s> user-agent: test\r\n |
|
387 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
388 s> \r\n |
|
389 s> makefile('rb', None) |
|
390 s> HTTP/1.1 301 Redirect\r\n |
|
391 s> Server: testing stub value\r\n |
|
392 s> Date: $HTTP_DATE$\r\n |
|
393 s> Location: http://$LOCALIP:$HGPORT/redirected?cmd=capabilities\r\n (glob) |
|
394 s> Content-Type: text/plain\r\n |
|
395 s> Content-Length: 10\r\n |
|
396 s> \r\n |
|
397 s> redirected |
|
398 s> GET /redirected?cmd=capabilities HTTP/1.1\r\n |
|
399 s> Accept-Encoding: identity\r\n |
|
400 s> user-agent: test\r\n |
|
401 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
402 s> \r\n |
|
403 s> makefile('rb', None) |
|
404 s> HTTP/1.1 200 Script output follows\r\n |
|
405 s> Server: testing stub value\r\n |
|
406 s> Date: $HTTP_DATE$\r\n |
|
407 s> Content-Type: application/mercurial-0.1\r\n |
|
408 s> Content-Length: 453\r\n |
|
409 s> \r\n |
|
410 s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash |
|
411 |
|
412 Test with the HTTP peer |
|
413 |
|
414 $ hg --verbose debugwireproto http://$LOCALIP:$HGPORT/redirector << EOF |
|
415 > command heads |
|
416 > EOF |
|
417 s> GET /redirector?cmd=capabilities HTTP/1.1\r\n |
|
418 s> Accept-Encoding: identity\r\n |
|
419 s> accept: application/mercurial-0.1\r\n |
|
420 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
421 s> user-agent: Mercurial debugwireproto\r\n |
|
422 s> \r\n |
|
423 s> makefile('rb', None) |
|
424 s> HTTP/1.1 301 Redirect\r\n |
|
425 s> Server: testing stub value\r\n |
|
426 s> Date: $HTTP_DATE$\r\n |
|
427 s> Location: http://$LOCALIP:$HGPORT/redirected?cmd=capabilities\r\n (glob) |
|
428 s> Content-Type: text/plain\r\n |
|
429 s> Content-Length: 10\r\n |
|
430 s> \r\n |
|
431 s> redirected |
|
432 s> GET /redirected?cmd=capabilities HTTP/1.1\r\n |
|
433 s> Accept-Encoding: identity\r\n |
|
434 s> accept: application/mercurial-0.1\r\n |
|
435 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
436 s> user-agent: Mercurial debugwireproto\r\n |
|
437 s> \r\n |
|
438 s> makefile('rb', None) |
|
439 s> HTTP/1.1 200 Script output follows\r\n |
|
440 s> Server: testing stub value\r\n |
|
441 s> Date: $HTTP_DATE$\r\n |
|
442 s> Content-Type: application/mercurial-0.1\r\n |
|
443 s> Content-Length: 453\r\n |
|
444 s> \r\n |
|
445 real URL is http://$LOCALIP:$HGPORT/redirected (glob) |
|
446 s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash |
|
447 sending heads command |
|
448 s> GET /redirected?cmd=heads HTTP/1.1\r\n |
|
449 s> Accept-Encoding: identity\r\n |
|
450 s> vary: X-HgProto-1\r\n |
|
451 s> x-hgproto-1: 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull\r\n |
|
452 s> accept: application/mercurial-0.1\r\n |
|
453 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
454 s> user-agent: Mercurial debugwireproto\r\n |
|
455 s> \r\n |
|
456 s> makefile('rb', None) |
|
457 s> HTTP/1.1 200 Script output follows\r\n |
|
458 s> Server: testing stub value\r\n |
|
459 s> Date: $HTTP_DATE$\r\n |
|
460 s> Content-Type: application/mercurial-0.1\r\n |
|
461 s> Content-Length: 41\r\n |
|
462 s> \r\n |
|
463 s> 96ee1d7354c4ad7372047672c36a1f561e3a6a4c\n |
|
464 response: [b'\x96\xee\x1dsT\xc4\xadsr\x04vr\xc3j\x1fV\x1e:jL'] |
|
465 |
|
466 $ killdaemons.py |
|
467 |
|
468 Now test a variation where we strip the query string from the redirect URL. |
|
469 (SCM Manager apparently did this and clients would recover from it) |
|
470 |
|
471 $ hg --config extensions.redirect=$TESTTMP/redirectext.py \ |
|
472 > --config server.compressionengines=zlib \ |
|
473 > --config testing.redirectqs=false \ |
|
474 > serve --web-conf paths.conf --pid-file hg.pid -p $HGPORT -d |
|
475 $ cat hg.pid > $DAEMON_PIDS |
|
476 |
|
477 $ hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT << EOF |
|
478 > httprequest GET /redirector?cmd=capabilities |
|
479 > user-agent: test |
|
480 > EOF |
|
481 using raw connection to peer |
|
482 s> GET /redirector?cmd=capabilities HTTP/1.1\r\n |
|
483 s> Accept-Encoding: identity\r\n |
|
484 s> user-agent: test\r\n |
|
485 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
486 s> \r\n |
|
487 s> makefile('rb', None) |
|
488 s> HTTP/1.1 301 Redirect\r\n |
|
489 s> Server: testing stub value\r\n |
|
490 s> Date: $HTTP_DATE$\r\n |
|
491 s> Location: http://$LOCALIP:$HGPORT/redirected\r\n (glob) |
|
492 s> Content-Type: text/plain\r\n |
|
493 s> Content-Length: 10\r\n |
|
494 s> \r\n |
|
495 s> redirected |
|
496 s> GET /redirected HTTP/1.1\r\n |
|
497 s> Accept-Encoding: identity\r\n |
|
498 s> user-agent: test\r\n |
|
499 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
500 s> \r\n |
|
501 s> makefile('rb', None) |
|
502 s> HTTP/1.1 200 Script output follows\r\n |
|
503 s> Server: testing stub value\r\n |
|
504 s> Date: $HTTP_DATE$\r\n |
|
505 s> ETag: W/"*"\r\n (glob) |
|
506 s> Content-Type: text/html; charset=ascii\r\n |
|
507 s> Transfer-Encoding: chunked\r\n |
|
508 s> \r\n |
|
509 s> 414\r\n |
|
510 s> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n |
|
511 s> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n |
|
512 s> <head>\n |
|
513 s> <link rel="icon" href="/redirected/static/hgicon.png" type="image/png" />\n |
|
514 s> <meta name="robots" content="index, nofollow" />\n |
|
515 s> <link rel="stylesheet" href="/redirected/static/style-paper.css" type="text/css" />\n |
|
516 s> <script type="text/javascript" src="/redirected/static/mercurial.js"></script>\n |
|
517 s> \n |
|
518 s> <title>redirected: log</title>\n |
|
519 s> <link rel="alternate" type="application/atom+xml"\n |
|
520 s> href="/redirected/atom-log" title="Atom feed for redirected" />\n |
|
521 s> <link rel="alternate" type="application/rss+xml"\n |
|
522 s> href="/redirected/rss-log" title="RSS feed for redirected" />\n |
|
523 s> </head>\n |
|
524 s> <body>\n |
|
525 s> \n |
|
526 s> <div class="container">\n |
|
527 s> <div class="menu">\n |
|
528 s> <div class="logo">\n |
|
529 s> <a href="https://mercurial-scm.org/">\n |
|
530 s> <img src="/redirected/static/hglogo.png" alt="mercurial" /></a>\n |
|
531 s> </div>\n |
|
532 s> <ul>\n |
|
533 s> <li class="active">log</li>\n |
|
534 s> <li><a href="/redirected/graph/tip">graph</a></li>\n |
|
535 s> <li><a href="/redirected/tags">tags</a></li>\n |
|
536 s> <li><a href=" |
|
537 s> \r\n |
|
538 s> 810\r\n |
|
539 s> /redirected/bookmarks">bookmarks</a></li>\n |
|
540 s> <li><a href="/redirected/branches">branches</a></li>\n |
|
541 s> </ul>\n |
|
542 s> <ul>\n |
|
543 s> <li><a href="/redirected/rev/tip">changeset</a></li>\n |
|
544 s> <li><a href="/redirected/file/tip">browse</a></li>\n |
|
545 s> </ul>\n |
|
546 s> <ul>\n |
|
547 s> \n |
|
548 s> </ul>\n |
|
549 s> <ul>\n |
|
550 s> <li><a href="/redirected/help">help</a></li>\n |
|
551 s> </ul>\n |
|
552 s> <div class="atom-logo">\n |
|
553 s> <a href="/redirected/atom-log" title="subscribe to atom feed">\n |
|
554 s> <img class="atom-logo" src="/redirected/static/feed-icon-14x14.png" alt="atom feed" />\n |
|
555 s> </a>\n |
|
556 s> </div>\n |
|
557 s> </div>\n |
|
558 s> \n |
|
559 s> <div class="main">\n |
|
560 s> <h2 class="breadcrumb"><a href="/">Mercurial</a> > <a href="/redirected">redirected</a> </h2>\n |
|
561 s> <h3>log</h3>\n |
|
562 s> \n |
|
563 s> \n |
|
564 s> <form class="search" action="/redirected/log">\n |
|
565 s> \n |
|
566 s> <p><input name="rev" id="search1" type="text" size="30" value="" /></p>\n |
|
567 s> <div id="hint">Find changesets by keywords (author, files, the commit message), revision\n |
|
568 s> number or hash, or <a href="/redirected/help/revsets">revset expression</a>.</div>\n |
|
569 s> </form>\n |
|
570 s> \n |
|
571 s> <div class="navigate">\n |
|
572 s> <a href="/redirected/shortlog/tip?revcount=30">less</a>\n |
|
573 s> <a href="/redirected/shortlog/tip?revcount=120">more</a>\n |
|
574 s> | rev 0: <a href="/redirected/shortlog/96ee1d7354c4">(0)</a> <a href="/redirected/shortlog/tip">tip</a> \n |
|
575 s> </div>\n |
|
576 s> \n |
|
577 s> <table class="bigtable">\n |
|
578 s> <thead>\n |
|
579 s> <tr>\n |
|
580 s> <th class="age">age</th>\n |
|
581 s> <th class="author">author</th>\n |
|
582 s> <th class="description">description</th>\n |
|
583 s> </tr>\n |
|
584 s> </thead>\n |
|
585 s> <tbody class="stripes2">\n |
|
586 s> <tr>\n |
|
587 s> <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>\n |
|
588 s> <td class="author">test</td>\n |
|
589 s> <td class="description">\n |
|
590 s> <a href="/redirected/rev/96ee1d7354c4">initial</a>\n |
|
591 s> <span class="phase">draft</span> <span class="branchhead">default</span> <span class="tag">tip</span> \n |
|
592 s> </td>\n |
|
593 s> </tr>\n |
|
594 s> \n |
|
595 s> </tbody>\n |
|
596 s> </table>\n |
|
597 s> \n |
|
598 s> <div class="navigate">\n |
|
599 s> <a href="/redirected/shortlog/tip?revcount=30">less</a>\n |
|
600 s> <a href="/redirected/shortlog/tip?revcount=120">more</a>\n |
|
601 s> | rev 0: <a href="/redirected/shortlog/96ee1d7354c4">(0)</a> <a href="/redirected/shortlog/tip">tip</a> \n |
|
602 s> </div>\n |
|
603 s> \n |
|
604 s> <script type="text/javascript">\n |
|
605 s> ajaxScrollInit(\n |
|
606 s> \'/redirected/shortlog/%next%\',\n |
|
607 s> \'\', <!-- NEXTHASH\n |
|
608 s> function (htmlText) { |
|
609 s> \r\n |
|
610 s> 14a\r\n |
|
611 s> \n |
|
612 s> var m = htmlText.match(/\'(\\w+)\', <!-- NEXTHASH/);\n |
|
613 s> return m ? m[1] : null;\n |
|
614 s> },\n |
|
615 s> \'.bigtable > tbody\',\n |
|
616 s> \'<tr class="%class%">\\\n |
|
617 s> <td colspan="3" style="text-align: center;">%text%</td>\\\n |
|
618 s> </tr>\'\n |
|
619 s> );\n |
|
620 s> </script>\n |
|
621 s> \n |
|
622 s> </div>\n |
|
623 s> </div>\n |
|
624 s> \n |
|
625 s> \n |
|
626 s> \n |
|
627 s> </body>\n |
|
628 s> </html>\n |
|
629 s> \n |
|
630 s> \r\n |
|
631 s> 0\r\n |
|
632 s> \r\n |
|
633 |
|
634 $ hg --verbose debugwireproto http://$LOCALIP:$HGPORT/redirector << EOF |
|
635 > command heads |
|
636 > EOF |
|
637 s> GET /redirector?cmd=capabilities HTTP/1.1\r\n |
|
638 s> Accept-Encoding: identity\r\n |
|
639 s> accept: application/mercurial-0.1\r\n |
|
640 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
641 s> user-agent: Mercurial debugwireproto\r\n |
|
642 s> \r\n |
|
643 s> makefile('rb', None) |
|
644 s> HTTP/1.1 301 Redirect\r\n |
|
645 s> Server: testing stub value\r\n |
|
646 s> Date: $HTTP_DATE$\r\n |
|
647 s> Location: http://$LOCALIP:$HGPORT/redirected\r\n (glob) |
|
648 s> Content-Type: text/plain\r\n |
|
649 s> Content-Length: 10\r\n |
|
650 s> \r\n |
|
651 s> redirected |
|
652 s> GET /redirected HTTP/1.1\r\n |
|
653 s> Accept-Encoding: identity\r\n |
|
654 s> accept: application/mercurial-0.1\r\n |
|
655 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
656 s> user-agent: Mercurial debugwireproto\r\n |
|
657 s> \r\n |
|
658 s> makefile('rb', None) |
|
659 s> HTTP/1.1 200 Script output follows\r\n |
|
660 s> Server: testing stub value\r\n |
|
661 s> Date: $HTTP_DATE$\r\n |
|
662 s> ETag: W/"*"\r\n (glob) |
|
663 s> Content-Type: text/html; charset=ascii\r\n |
|
664 s> Transfer-Encoding: chunked\r\n |
|
665 s> \r\n |
|
666 real URL is http://$LOCALIP:$HGPORT/redirected (glob) |
|
667 s> 414\r\n |
|
668 s> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n |
|
669 s> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n |
|
670 s> <head>\n |
|
671 s> <link rel="icon" href="/redirected/static/hgicon.png" type="image/png" />\n |
|
672 s> <meta name="robots" content="index, nofollow" />\n |
|
673 s> <link rel="stylesheet" href="/redirected/static/style-paper.css" type="text/css" />\n |
|
674 s> <script type="text/javascript" src="/redirected/static/mercurial.js"></script>\n |
|
675 s> \n |
|
676 s> <title>redirected: log</title>\n |
|
677 s> <link rel="alternate" type="application/atom+xml"\n |
|
678 s> href="/redirected/atom-log" title="Atom feed for redirected" />\n |
|
679 s> <link rel="alternate" type="application/rss+xml"\n |
|
680 s> href="/redirected/rss-log" title="RSS feed for redirected" />\n |
|
681 s> </head>\n |
|
682 s> <body>\n |
|
683 s> \n |
|
684 s> <div class="container">\n |
|
685 s> <div class="menu">\n |
|
686 s> <div class="logo">\n |
|
687 s> <a href="https://mercurial-scm.org/">\n |
|
688 s> <img src="/redirected/static/hglogo.png" alt="mercurial" /></a>\n |
|
689 s> </div>\n |
|
690 s> <ul>\n |
|
691 s> <li class="active">log</li>\n |
|
692 s> <li><a href="/redirected/graph/tip">graph</a></li>\n |
|
693 s> <li><a href="/redirected/tags">tags</a |
|
694 s> GET /redirected?cmd=capabilities HTTP/1.1\r\n |
|
695 s> Accept-Encoding: identity\r\n |
|
696 s> accept: application/mercurial-0.1\r\n |
|
697 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
698 s> user-agent: Mercurial debugwireproto\r\n |
|
699 s> \r\n |
|
700 s> makefile('rb', None) |
|
701 s> HTTP/1.1 200 Script output follows\r\n |
|
702 s> Server: testing stub value\r\n |
|
703 s> Date: $HTTP_DATE$\r\n |
|
704 s> Content-Type: application/mercurial-0.1\r\n |
|
705 s> Content-Length: 453\r\n |
|
706 s> \r\n |
|
707 real URL is http://$LOCALIP:$HGPORT/redirected (glob) |
|
708 s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash |
|
709 sending heads command |
|
710 s> GET /redirected?cmd=heads HTTP/1.1\r\n |
|
711 s> Accept-Encoding: identity\r\n |
|
712 s> vary: X-HgProto-1\r\n |
|
713 s> x-hgproto-1: 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull\r\n |
|
714 s> accept: application/mercurial-0.1\r\n |
|
715 s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
716 s> user-agent: Mercurial debugwireproto\r\n |
|
717 s> \r\n |
|
718 s> makefile('rb', None) |
|
719 s> HTTP/1.1 200 Script output follows\r\n |
|
720 s> Server: testing stub value\r\n |
|
721 s> Date: $HTTP_DATE$\r\n |
|
722 s> Content-Type: application/mercurial-0.1\r\n |
|
723 s> Content-Length: 41\r\n |
|
724 s> \r\n |
|
725 s> 96ee1d7354c4ad7372047672c36a1f561e3a6a4c\n |
|
726 response: [b'\x96\xee\x1dsT\xc4\xadsr\x04vr\xc3j\x1fV\x1e:jL'] |