12 Commits
8 changed files with 1105 additions and 998 deletions
+14 -1
View File
@@ -74,6 +74,19 @@ class Server {
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'] allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With']
})) }))
// URL normalization middleware - collapse multiple slashes
app.use((req, res, next) => {
if (req.path && req.path.includes('//')) {
// Collapse multiple consecutive slashes into a single slash
const normalizedPath = req.path.replace(/\/+/g, '/')
// Reconstruct req.url with normalized path
const queryString = req.url.includes('?') ? req.url.substring(req.url.indexOf('?')) : ''
req.url = normalizedPath + queryString
req.path = normalizedPath
}
next()
})
// Apply basic auth middleware if enabled // Apply basic auth middleware if enabled
// This must run before x402 middleware to set req.locals.basicAuthValid // This must run before x402 middleware to set req.locals.basicAuthValid
if (basicAuthSettings.enabled) { if (basicAuthSettings.enabled) {
@@ -161,7 +174,7 @@ class Server {
// Endpoint logging middleware // Endpoint logging middleware
app.use((req, res, next) => { app.use((req, res, next) => {
console.log(`Endpoint called: ${req.method} ${req.path}`) console.log(`Endpoint called: ${req.method} ${req.path} by ${req.ip}`)
res.on('finish', () => { res.on('finish', () => {
console.log(`Endpoint responded: ${req.method} ${req.path} - ${res.statusCode}`) console.log(`Endpoint responded: ${req.method} ${req.path} - ${res.statusCode}`)
}) })
+1076 -976
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -15,17 +15,17 @@
"license": "MIT", "license": "MIT",
"description": "REST API proxy to Bitcoin Cash infrastructure", "description": "REST API proxy to Bitcoin Cash infrastructure",
"dependencies": { "dependencies": {
"@psf/bch-js": "7.1.2", "@psf/bch-js": "7.1.7",
"axios": "1.7.7", "axios": "1.7.7",
"cors": "2.8.5", "cors": "2.8.5",
"dotenv": "16.3.1", "dotenv": "16.3.1",
"express": "5.1.0", "express": "5.1.0",
"minimal-slp-wallet": "7.0.2", "minimal-slp-wallet": "7.1.2",
"psffpp": "1.2.1", "psffpp": "1.2.1",
"slp-token-media": "1.2.10", "slp-token-media": "1.2.10",
"winston": "3.11.0", "winston": "3.11.0",
"winston-daily-rotate-file": "4.7.1", "winston-daily-rotate-file": "4.7.1",
"x402-bch-express": "1.1.1" "x402-bch-express": "2.0.0"
}, },
"devDependencies": { "devDependencies": {
"apidoc": "1.2.0", "apidoc": "1.2.0",
+8 -6
View File
@@ -22,14 +22,16 @@ LOCAL_RESTURL=http://172.17.0.1:5942/v6
PORT=5942 PORT=5942
# x402 payments required to access this API? # x402 payments required to access this API?
X402_ENABLED=true X402_ENABLED=false
SERVER_BCH_ADDRESS=bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d #X402_ENABLED=true
FACILITATOR_URL=http://localhost:4345/facilitator #SERVER_BCH_ADDRESS=bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d
X402_PRICE_SAT=200 #FACILITATOR_URL=http://localhost:4345/facilitator
#X402_PRICE_SAT=200
# Basic Authentication required to access this API? # Basic Authentication required to access this API?
USE_BASIC_AUTH=true USE_BASIC_AUTH=false
BASIC_AUTH_TOKEN=some-random-token #USE_BASIC_AUTH=true
#BASIC_AUTH_TOKEN=some-random-token
# END ACCESS CONTROL # END ACCESS CONTROL
+3 -1
View File
@@ -51,6 +51,8 @@ RUN git clone https://github.com/Permissionless-Software-Foundation/psf-bch-api
# and `stage` has the most up-to-date changes. # and `stage` has the most up-to-date changes.
WORKDIR /home/safeuser/psf-bch-api WORKDIR /home/safeuser/psf-bch-api
RUN git checkout ct-unstable
# Install dependencies # Install dependencies
RUN npm install RUN npm install
RUN npm install minimal-slp-wallet RUN npm install minimal-slp-wallet
@@ -58,7 +60,7 @@ RUN npm install minimal-slp-wallet
# Generate the API docs # Generate the API docs
RUN npm run docs RUN npm run docs
COPY .env-local .env COPY .env .env
CMD ["npm", "start"] CMD ["npm", "start"]
-3
View File
@@ -1,3 +0,0 @@
#!/bin/bash
npm start
-7
View File
@@ -1,7 +0,0 @@
// Simple Node.js app that prints 'hello world' every 10 seconds
setInterval(() => {
console.log('hello world')
}, 10000)
console.log('Timer started. Printing "hello world" every 10 seconds...')