2012-02-06 18:59:34 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Concrete HTTP sink which uses "echo" and "header()" to emit data.
|
|
|
|
*/
|
|
|
|
final class AphrontPHPHTTPSink extends AphrontHTTPSink {
|
|
|
|
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
protected function emitHTTPStatus($code, $message = '') {
|
2012-02-06 18:59:34 +01:00
|
|
|
if ($code != 200) {
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
$header = "HTTP/1.0 {$code}";
|
|
|
|
if (strlen($message)) {
|
|
|
|
$header .= " {$message}";
|
|
|
|
}
|
|
|
|
header($header);
|
2012-02-06 18:59:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function emitHeader($name, $value) {
|
|
|
|
header("{$name}: {$value}", $replace = false);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function emitData($data) {
|
|
|
|
echo $data;
|
2015-03-14 16:29:12 +01:00
|
|
|
|
|
|
|
// Try to push the data to the browser. This has a lot of caveats around
|
|
|
|
// browser buffering and display behavior, but approximately works most
|
|
|
|
// of the time.
|
|
|
|
flush();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function isWritable() {
|
|
|
|
return !connection_aborted();
|
2012-02-06 18:59:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|