Skip to content

Commit 42d78dc

Browse files
committed
Force unchunk body for php?
1 parent 3e70ef5 commit 42d78dc

File tree

4 files changed

+75
-24
lines changed

4 files changed

+75
-24
lines changed

legacyServer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ func ServeLegacy(w http.ResponseWriter, r *http.Request) {
177177
}
178178

179179
// No response from any method, assume not found
180+
fmt.Printf("[Legacy] 404 Not Found: %s\n", r.URL)
180181
http.NotFound(w, r)
181182
}
182183

legacyServer_test.go

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func TestServeLegacy404(t *testing.T) {
145145
setup(&testServerSettings)
146146

147147
test := &legacyServerTest{
148-
request: makeNewRequest("GET", "https://example.com/404-example"),
148+
request: makeNewRequest("GET", "https://example.com/404-example", nil),
149149
response: &legacyServerTestResponse{
150150
statusCode: http.StatusNotFound,
151151
},
@@ -176,7 +176,7 @@ func TestServeLegacy200(t *testing.T) {
176176
headers := &http.Header{}
177177
headers.Set("Content-Length", strconv.Itoa(len(testData)))
178178
test := &legacyServerTest{
179-
request: makeNewRequest("GET", "http://example.com/test.txt"),
179+
request: makeNewRequest("GET", "http://example.com/test.txt", nil),
180180
response: &legacyServerTestResponse{
181181
statusCode: http.StatusOK,
182182
headers: headers,
@@ -216,7 +216,7 @@ func TestServeLegacy200WithQuery(t *testing.T) {
216216
headers := &http.Header{}
217217
headers.Set("Content-Length", strconv.Itoa(len(testDataQuery)))
218218
test := &legacyServerTest{
219-
request: makeNewRequest("GET", "http://example.com/test.txt?query=true"),
219+
request: makeNewRequest("GET", "http://example.com/test.txt?query=true", nil),
220220
response: &legacyServerTestResponse{
221221
statusCode: http.StatusOK,
222222
headers: headers,
@@ -248,7 +248,7 @@ func TestServeLegacy200Index(t *testing.T) {
248248
headers := &http.Header{}
249249
headers.Set("Content-Length", strconv.Itoa(len(testData)))
250250
test := &legacyServerTest{
251-
request: makeNewRequest("GET", "http://example.com/"),
251+
request: makeNewRequest("GET", "http://example.com/", nil),
252252
response: &legacyServerTestResponse{
253253
statusCode: http.StatusOK,
254254
headers: headers,
@@ -281,7 +281,7 @@ func TestServeLegacy200Script(t *testing.T) {
281281
headers := &http.Header{}
282282
headers.Set("Content-Length", strconv.Itoa(len(testStr)))
283283
test := &legacyServerTest{
284-
request: makeNewRequest("GET", "http://example.com/index.php"),
284+
request: makeNewRequest("GET", "http://example.com/index.php", nil),
285285
response: &legacyServerTestResponse{
286286
statusCode: http.StatusOK,
287287
headers: headers,
@@ -294,11 +294,47 @@ func TestServeLegacy200Script(t *testing.T) {
294294
}
295295
}
296296

297+
func TestServeLegacy200ScriptPost(t *testing.T) {
298+
setup(&testServerSettings)
299+
300+
// Write a test file
301+
testStr := "success"
302+
testData := []byte(`<?php
303+
$data = $_POST['data'];
304+
echo "$data"; ?>`)
305+
testFile := path.Join(testServerSettings.LegacyCGIBINPath, "example.com", "index.php")
306+
// Make directory path
307+
err := os.MkdirAll(path.Dir(testFile), os.ModePerm)
308+
if err != nil {
309+
t.Error(err)
310+
}
311+
err = os.WriteFile(testFile, testData, os.ModePerm)
312+
if err != nil {
313+
t.Error(err)
314+
}
315+
316+
headers := &http.Header{}
317+
headers.Set("Content-Length", strconv.Itoa(len(testStr)))
318+
test := &legacyServerTest{
319+
request: makeNewRequest("POST", "http://example.com/index.php", bytes.NewBuffer([]byte(fmt.Sprintf(`data=%s`, testStr)))),
320+
response: &legacyServerTestResponse{
321+
statusCode: http.StatusOK,
322+
headers: headers,
323+
},
324+
}
325+
test.request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
326+
327+
err = test.run()
328+
if err != nil {
329+
t.Error(err)
330+
}
331+
}
332+
297333
func TestServeLegacyDisabledOnline(t *testing.T) {
298334
setup(&testServerSettings)
299335

300336
test := &legacyServerTest{
301-
request: makeNewRequest("GET", "http://andkon.com/grey/grey.swf"),
337+
request: makeNewRequest("GET", "http://andkon.com/grey/grey.swf", nil),
302338
response: &legacyServerTestResponse{
303339
statusCode: http.StatusNotFound,
304340
},
@@ -319,7 +355,7 @@ func TestServeLegacyOnline200(t *testing.T) {
319355
headers := &http.Header{}
320356
headers.Set("Content-Length", "1065015")
321357
test := &legacyServerTest{
322-
request: makeNewRequest("GET", "http://andkon.com/grey/grey.swf"),
358+
request: makeNewRequest("GET", "http://andkon.com/grey/grey.swf", nil),
323359
response: &legacyServerTestResponse{
324360
statusCode: http.StatusOK,
325361
savedFile: &savedFile,
@@ -340,7 +376,7 @@ func TestServeLegacyOnline200Index(t *testing.T) {
340376

341377
savedFile := path.Join(settings.LegacyHTDOCSPath, "kongregate.com", "ChuckTheSheep", "index.htm")
342378
test := &legacyServerTest{
343-
request: makeNewRequest("GET", "http://kongregate.com/ChuckTheSheep/"),
379+
request: makeNewRequest("GET", "http://kongregate.com/ChuckTheSheep/", nil),
344380
response: &legacyServerTestResponse{
345381
statusCode: http.StatusOK,
346382
savedFile: &savedFile,
@@ -357,7 +393,7 @@ func TestServeLegacyDisabledMad4fp(t *testing.T) {
357393
setup(&testServerSettings)
358394

359395
test := &legacyServerTest{
360-
request: makeNewRequest("GET", "http://flashpointarchive.org/images/logo.svg"),
396+
request: makeNewRequest("GET", "http://flashpointarchive.org/images/logo.svg", nil),
361397
response: &legacyServerTestResponse{
362398
statusCode: http.StatusNotFound,
363399
},
@@ -376,7 +412,7 @@ func TestServeLegacyMad4fp200(t *testing.T) {
376412

377413
savedFile := path.Join(settings.LegacyHTDOCSPath, "content", "flashpointarchive.org", "images", "logo.svg")
378414
test := &legacyServerTest{
379-
request: makeNewRequest("GET", "http://flashpointarchive.org/images/logo.svg"),
415+
request: makeNewRequest("GET", "http://flashpointarchive.org/images/logo.svg", nil),
380416
response: &legacyServerTestResponse{
381417
statusCode: http.StatusOK,
382418
savedFile: &savedFile,
@@ -389,11 +425,10 @@ func TestServeLegacyMad4fp200(t *testing.T) {
389425
}
390426
}
391427

392-
func makeNewRequest(method string, url string) *http.Request {
393-
request, err := http.NewRequest(method, url, nil)
428+
func makeNewRequest(method string, url string, body io.Reader) *http.Request {
429+
request, err := http.NewRequest(method, url, body)
394430
if err != nil {
395431
panic(err)
396432
}
397-
398433
return request
399434
}

main.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"encoding/json"
88
"flag"
99
"fmt"
10+
"io"
1011
"io/ioutil"
1112
"log"
1213
"net"
@@ -80,15 +81,17 @@ func initServer() {
8081
verboseLogging := flag.Bool("v", false, "should every proxy request be logged to stdout")
8182
proxyPort := flag.Int("proxyPort", 22500, "proxy listen port")
8283
serverHTTPPort := flag.Int("serverHttpPort", 22501, "zip server http listen port")
83-
gameRootPath := flag.String("gameRootPath", "D:\\Flashpoint\\Data\\Games", "This is the path where to find the zips")
84+
gameRootPath := flag.String("gameRootPath", serverSettings.GameRootPath, "This is the path where to find the zips")
8485
rootPath := flag.String("rootPath", "D:\\Flashpoint", "The path that other relative paths use as a base")
8586
apiPrefix := flag.String("apiPrefix", "/fpProxy/api", "apiPrefix is used to prefix any API call.")
8687
useMad4FP := flag.Bool("UseMad4FP", false, "flag to turn on/off Mad4FP.")
8788
externalLegacyPort := flag.String("externalLegacyPort", "22600", "The port that the external legacy server is running on (if handling legacy is disabled).")
88-
legacyHTDOCSPath := flag.String("legacyHTDOCSPath", "D:\\Flashpoint\\Legacy\\htdocs", "This is the path for HTDOCS")
89-
phpCgiPath := flag.String("phpCgiPath", "D:\\Flashpoint\\Legacy\\php-cgi.exe", "Path to PHP CGI executable")
89+
legacyHTDOCSPath := flag.String("legacyHTDOCSPath", serverSettings.LegacyHTDOCSPath, "This is the path for HTDOCS")
90+
phpCgiPath := flag.String("phpCgiPath", serverSettings.PhpCgiPath, "Path to PHP CGI executable")
9091
useInfinityServer := flag.Bool("useInfinityServer", false, "Whether to use the infinity server or not")
91-
infinityServerURL := flag.String("infinityServerURL", "https://example.com/", "The URL of the infinity server")
92+
infinityServerURL := flag.String("infinityServerURL", serverSettings.InfinityServerURL, "The URL of the infinity server")
93+
legacyCGIBINPath := flag.String("legacyCGIBINPath", serverSettings.LegacyCGIBINPath, "This is the path for CGI-BIN")
94+
handleLegacyRequests := flag.Bool("handleLegacyRequests", false, "Whether to handle legacy requests internally (true) or externally (false)")
9295

9396
flag.Parse()
9497

@@ -104,6 +107,11 @@ func initServer() {
104107
serverSettings.ApiPrefix = *apiPrefix
105108
serverSettings.UseMad4FP = *useMad4FP
106109
serverSettings.ExternalLegacyPort = *externalLegacyPort
110+
serverSettings.LegacyCGIBINPath, err = filepath.Abs(path.Join(serverSettings.RootPath, strings.Trim(*legacyCGIBINPath, "\"")))
111+
if err != nil {
112+
fmt.Printf("Failed to get absolute cgi-bin path")
113+
return
114+
}
107115
serverSettings.LegacyHTDOCSPath, err = filepath.Abs(path.Join(serverSettings.RootPath, strings.Trim(*legacyHTDOCSPath, "\"")))
108116
if err != nil {
109117
fmt.Printf("Failed to get absolute htdocs path")
@@ -121,11 +129,14 @@ func initServer() {
121129
}
122130
serverSettings.UseInfinityServer = *useInfinityServer
123131
serverSettings.InfinityServerURL = *infinityServerURL
132+
serverSettings.HandleLegacyRequests = *handleLegacyRequests
124133

125134
// Print out all path settings
126135
fmt.Printf("Root Path: %s\n", serverSettings.RootPath)
127136
fmt.Printf("PHP CGI Path: %s\n", serverSettings.PhpCgiPath)
128137
fmt.Printf("Legacy HTDOCS Path: %s\n", serverSettings.LegacyHTDOCSPath)
138+
fmt.Printf("Legacy CGI BIN Path: %s\n", serverSettings.LegacyCGIBINPath)
139+
fmt.Printf("Games Path: %s\n", serverSettings.GameRootPath)
129140

130141
//Setup the proxy.
131142
proxy = goproxy.NewProxyHttpServer()
@@ -188,6 +199,8 @@ func setContentType(r *http.Request, resp *http.Response) {
188199
func handleRequest(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
189200
// Remove port from host if exists (old apps don't clean it before sending requests?)
190201
r.URL.Host = strings.Split(r.URL.Host, ":")[0]
202+
// Clone the body into both requests by reading and making 2 new readers
203+
contents, _ := ioutil.ReadAll(r.Body)
191204

192205
// Copy the original request
193206
gamezipRequest := &http.Request{
@@ -199,12 +212,9 @@ func handleRequest(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http
199212
RawQuery: r.URL.RawQuery,
200213
},
201214
Header: r.Header,
202-
Body: r.Body,
215+
Body: nil,
203216
}
204-
205-
// Clone the body into both requests by reading and making 2 new readers
206-
contents, _ := ioutil.ReadAll(r.Body)
207-
gamezipRequest.Body = ioutil.NopCloser(bytes.NewReader(contents))
217+
gamezipRequest.Body = io.NopCloser(bytes.NewReader(contents))
208218

209219
// Make the request to the zip server.
210220
client := &http.Client{}
@@ -231,7 +241,7 @@ func handleRequest(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http
231241
RawQuery: r.URL.RawQuery,
232242
},
233243
Header: r.Header,
234-
Body: r.Body,
244+
Body: nil,
235245
}
236246
// Copy in a new body reader
237247
legacyRequest.Body = ioutil.NopCloser(bytes.NewReader(contents))
@@ -273,6 +283,8 @@ func handleRequest(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http
273283
setContentType(r, proxyResp)
274284

275285
// Add extra headers
286+
proxyResp.Header.Set("Access-Control-Allow-Headers", "*")
287+
proxyResp.Header.Set("Access-Control-Allow-Methods", "*")
276288
proxyResp.Header.Set("Access-Control-Allow-Origin", "*")
277289
// Keep Alive
278290
if strings.ToLower(r.Header.Get("Connection")) == "keep-alive" {

proxySettings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
{
2+
"rootPath": "../",
23
"legacyHTDOCSPath": "Legacy/htdocs/",
34
"legacyCGIBINPath": "Legacy/cgi-bin/",
45
"legacyPHPPath": "Legacy/",
5-
"rootPath": "../",
6+
"gameRootPath": "Data/Games/",
7+
"phpCgiPath": "Legacy/php-cgi.exe",
8+
"infinityServerURL": "https://infinity.unstable.life/Flashpoint/Legacy/htdocs/",
69
"overridePaths": [
710
"../Legacy/middleware_overrides/"
811
],

0 commit comments

Comments
 (0)